循环串行异步 Promise

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

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

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) => {
    ...
})
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容