js绑定pending状态的任务 / 绑定不确定状态的任务

我们知道promise有三个状态:等待(pending)、已完成(fulfilled)、已拒绝(rejected),

而且我们只能在任务发起之前进行绑定,在then/catch/finally中处理任务,例如:

new Promise((resolve, reject) => {
    // 延时任务,异步任务
    setTimeout(() => {
      resolve('')
    }, 1000)
  }).then((data) => {
    console.log(data)
  })

// 接口请求
getList(parmas).then((data) => {
  console.log(data)
})

那么有没有办法可以不用事先绑定呢?答案是肯定的,这里需要引入一个第三方库async-task-mapping,首先执行createTaskList()初始化一个任务列表,

三个参数:

  • ordered是否按照先绑定后请求的顺序,
  • requestCount:访问结果的次数,
  • responseCount:向任务列表内增加几个数据
import { createTaskList } from 'async-task-mapping'
const asyncTask = createTaskList({ordered: false, requestCount: 1, responseCount: 1})

// 上面的接口请求就可以改为
const send = () => {
  getList(parmas).then((data) => {
    asyncTask.pushResponse(data)
  })
}

const log = async () => {
    const data = asyncTask.request()
    console.log(data)
}

// send 和log的顺序随意安排,甚至可以先执行log,这样仍然是先拿到getList,再打印
setTimeout(() => {
    send()
  }, 2000)

setTimeout(() => {
    log()
  }, 1000)

这里我们可以看到,请求接口的代码,和处理返回结果的代码在不同的函数当中,这样可以轻松解藕,避免在promise.then中写过多的代码。

同时,我们可以先发送请求,再绑定需要执行的代码,比如在setTimeout 1000ms的时候发送请求,在setTimeout 2000ms的时候写数据返回以后需要执行的代码,此时接口有可能已经返回了,也有可能还在请求当中。

这些我们不用管,使用asyncTask.request(),得到一个promise,如果接口已经返回了,那就直接返回数据,如果接口还在请求当中,那就返回一个正在pending的promise,等到接口完成,仍然会执行我们的代码。

你可能感兴趣的:(javascript,前端,开发语言)