Promise按顺序执行

发布于 2022-09-04 07:24:12 字数 542 浏览 26 评论 0

我知道要顺序执行Promise用他的than方法,但是这个太冗长了,
如何用all方法做到顺序执行?或者其它方法?

let a = () => {
            return new Promise((resolve,reject)=>{
                setTimeout(()=>{
                    resolve()
                    console.log(1)
                },100)
            })
        }            

        let b = () => {
            return new Promise((resolve,reject)=>{
                resolve()
                console.log(2)
            })
        }            

        Promise.all([a(),b()]);// 2 1

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

沐歌 2022-09-11 07:24:12

第一,需要搞清楚的是Promise.all是并行执行Promise而不是顺序执行;
第二,一个promise在创建的时候就会执行,也就是说只要顺序创建,那就能顺序执行。

function promiseFactory(index){
    return new Promise((resolve, reject) => {
        resolve()
        console.log(index)
    })
}

function executePromises(promisesIndex){
    var result = Promise.resolve()
    promisesIndex.forEach(index => {
        result = result.then(promiseFactory(index))
    })
    return result
}

executePromises([1,2,3,4])//1,2,3,4

参考了这篇文章中的代码,总结的以上两点应该就可以解决你的问题了
http://fex.baidu.com/blog/201...

失退 2022-09-11 07:24:12

似乎目前没有官方的API,但是这个功能是可以自己实现的。今天刚好遇到这个问题就自己写了一个,楼主可以参考一下;

let promiseIter = function (promises) {
    return new Promise((resolve, reject) => {
        nextPromise(0, promises);
        function nextPromise(index, promises) {
            let length = promises.length;
            if (index >= length) {
                resolve();
            }
            promises[index]()
                .then(() => {
                    nextPromise(index + 1, promises);
                })
                .catch((err) => {
                    reject(err);
                })
        }
    });
}

//使用
let a = () => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve()
            console.log(1)
        }, 100)
    })
}

let b = () => {
    return new Promise((resolve, reject) => {
        resolve()
        console.log(2)
    })
}

promiseIter([a, b]);// 2 1
盗琴音 2022-09-11 07:24:12

promises.reduce((p1,p2)=>p1.then(()=>p2)).then((r)=>r)

清浅ˋ旧时光 2022-09-11 07:24:12

自己封装一个函数,里面用then把promise连接起来。

思慕 2022-09-11 07:24:12

可以使用 co https://github.com/tj/co
或者 async 和 await

把回忆走一遍 2022-09-11 07:24:12

https://github.com/jun-lu/pro...

这个库的 .flat 可以链接promise并顺序执行

你对谁都笑 2022-09-11 07:24:12

其实还得加一个功能,当其中一个promise发生错误的时候,剩下的promise就全部停止

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文