【转】Promise循环串行执行写法

【原文链接】 https://segmentfault.com/q/1010000007499416

【注】 原文是一篇问答形式的帖子,此处做了小幅度整理; 本文转于此处,用于本人收藏,查找方便之用。如有侵权,请联系删除。

需求是有一个objects数组,其中的元素是每次异步事件需要的参数 异步事件事件接受参数并且串行执行,最终返回一个promise结果

Promise.all似乎是并行的?

const PromiseForEach = (objects, asyncDosometing) => {
    return new Promise((resolve, reject) => {
        Promise.all(objects.map((obj) => {
            return new Promise((resolve, reject) => {
                return asyncDosometing(obj).then(resolve, reject);
            });
        })).then(resolve, reject);
    });
};
复制代码

这样写似乎也是并行的?

const PromiseForEach = (objects,asyncDosometing) => {
        let result = Promise.resolve();
        objects.forEach((obj) => {
            result = result.then(asyncDosometing(obj));
        });
        return result;
    }
复制代码

// 测试结果为
// 直接打印了“成功” data为undefined 之后 一次性打印出所有“number”
// 而不是 每隔2s打印一个number number都打印完后 打印成功 并且data应给是个number数组

const list = [];
    for (let i = 0; i < 100; ++i) {
        list.push(i);
    }
    PromiseForEach(list, (number) => {

        return new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log(number);
                return resolve(number);
            }, 2000);
        })

    }).then((data) => {
        console.log("成功");
        console.log(data);
    }).catch((err) => {
        console.log("失败");
        console.log(err)
    });   
复制代码

两种写法貌似有有问题呢
到是用async/await实现了 虽然不知道对不对啊 但是实现了预期

const PromiseForEach = async(objects, asyncDosometing) => {
    let result = [];
    for (let obj in objects) {
        try {
            result.push(await asyncDosometing(obj));
        } catch (err) {
            return err;
        }
    }

    return result;
};
复制代码

请问用Promise实现这种逻辑的正确的写法是怎么样的?求解!谢谢!!!

下面是社区人士whbb的回答:

第二种方式的正确的 runjs.cn/code/ilckww… 如果需要返回结果的话, 可以再加一层 Promise

const list = [];
for (let i = 0; i < 100; ++i) {
    list.push(i);
}
复制代码
function PromiseForEach(arr, cb) {
    let realResult = []
    let result = Promise.resolve()
    arr.forEach((a, index) => {
        result = result.then(() => {
            return cb(a).then((res) => {
                realResult.push(res)
            })
        })
    })

    return result.then(() => {
        return realResult
    })
}

PromiseForEach(list, (number) => {

    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log(number);
            return resolve(number);
        }, 100);
    })

}).then((data) => {
    console.log("成功");
    console.log(data);
}).catch((err) => {
    console.log("失败");
    console.log(err)
}); 
复制代码

下面是一些杂七杂八的

  • 我一开始使用Promise时,一直找不到在for循环里面如何使用 promise来控制异步,并且在 循环体外,获取异步的结果数组。
  • 直到我看见了这个问答,看见了 let result = Promise.resolve() 这个写法,我赫然开朗。 用一个Promise对象,将异步任务执行完成的结果作为参数传递,并且通过 在then以后,push结果到一个全局的数组里面,最终获取到结果。
result = result.then(() => {
            return cb(a).then((res) => {
                realResult.push(res)
            })
        })
复制代码
  • 好吧,不乱说了。)>_<(

转载于:https://juejin.im/post/5a52c5485188257329144337

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值