1.0.0 • Published 4 years ago

@winwangqi/fetcher v1.0.0

Weekly downloads
-
License
MIT
Repository
github
Last release
4 years ago

Fetcher

An elegant and easy-to-use JavaScript library for managing the request process.

中文文档

get started

Installation

npm install -save @winwangqi/fetcher

Usage

const fetcher = new Fetcher({
  request() {
    // return request promise
  },

  onSuccess(response) {
    // do something...
  },

  // other options
})

// return request promise
fetcher.fetch()

API

Options

fieldtypedefaultrequireddescription
request() => Promise/YRequest method, the return value must be Promise
concurrentbooleantrueNWhether to support concurrent. If not, there can be only one request in fetching state at the same time
timeoutMsnumber0NRequest timeout duration. Request timeout throws TimeoutException
maxRetryTimesnumber0NMaximum number of retries when the request fails
onPendingFunction/NonPending event handler, triggered when the request is started
onSuccess(responseAfterPipe) => void/NonSuccess event handler, triggered when the request is successful
onFailureFunction/NonFailure event handler, triggered when the request fails
onComplete({ ok: boolean, payload: responseAfterPipe }) => void/NonComplete event handler, triggered when the request is completed (success or failure)
onChange({ status: 'pending' / 'success' / 'failure', payload: responseAfterPipe / error / undefined }) => void/NonChange event handler, triggered when the request status changes
onTimeoutFunction/NonTimeout event handler, triggered by request timeout
responsePiperesponse => responseAfterPipe/NPipeline for formatting Response data

Fetcher instance properties

filedtypedefaultdescription
fetchingbooleanfalseIs fetching
fetchedbooleanfalseWhether the request is completed
databooleannullResponse value for successful request
errorbooleannullRequest failed error

fetcher.fetch return value

fetcher.fetch return value is promise

fieldtypedescription
then(responseAfterPipe) => voidRequest completion callback function
catch(error) => voidRequest failed callback function
cancelFunctionCancel request
clearFunctionClear the timeout countdown for this request

Demo

React

class Example extends React.PureCompoennt {
  constructor(props) {
    super(props)

    const self = this

    this.setState(
      {
        fetcher: new Fetcher({
          request() {
            return new Promise((resolve, reject) => {
              setTimeout(() => {
                resolve('resolved')
              }, 1000)
            })
          },

          timeoutMS: 500,

          onChange() {
            self.forceUpdate()
          },
        }),
      },
      () => {
        this.state.fetcher.fetch()
      }
    )
  }

  render() {
    const { fetcher } = this.state

    return fetcher.fetched ? (
      <div>{fetcher.data}</div>
    ) : fetcher.fetching ? (
      <div>loading...</div>
    ) : fetcher.error ? (
      <div>error: {fetcher.error}</div>
    ) : null
  }
}

Since the request status is updated inside the fetcher, forceUpdate needs to be called in the onChange event to notify react to re-render

Vue

<template>
  <div v-if="fetcher.fetched">{{ fetcher.data }}</div>
  <div v-else>
    <div v-if="fetcher.fetching">loading</div>
    <div v-else-if="fetcher.error">{{ fetcher.error }}</div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      fetcher: new Fetcher({
        request() {
          return new Promise((resolve, reject) => {
            setTimeout(() => {
              resolve('resolved')
            }, 1000)
          })
        },

        timeoutMS: 500,
      }),
    }
  },

  mounted() {
    this.fetcher.fetch()
  },
}
</script>