循环串行异步 Promise

2018-05-09  本文已影响78人  书SHU

有时候会有这一种需要,需要在循环中执行一系列操作。但是循环的每次迭代的操作是异步的,此时如何实现“异步串行”呢?

先看一下例子,在没有循环时,如果串行:

new Promise((resolve, reject) => {
    new Promise((resolve, reject) => {
        // ... 一些异步操作
        return resolve(data)  // 返回这个 promise
    })
})
.then(() => {
    ...
})
.then(...)
.then(...)

转换为循环:
(思路为,每次 for 时候的 promise 为上一次迭代的 promise.then,即可串联起来)

function runSerial(lists, asyncTask) {
    let promise = Promise.resolve()
        _.each(lists, (i) => {
        promise = promise.then(() => asyncTask(i))
    })
    return promise
}

调用方法:

runSerial(self.apps, (app) => {
    const data = {
        ...
    }

    return new Promise((resolve, reject) => {
        self.$http.post(url, data).then(({data: {status, data}}) => {
            // ...
            resolve()
        })
    })
}).finally((res) => {
    ...
})
上一篇下一篇

猜你喜欢

热点阅读