gpt4 book ai didi

javascript - 实现 Promise.all 和 Promise.settle 的混合

转载 作者:数据小太阳 更新时间:2023-10-29 05:57:31 24 4
gpt4 key购买 nike

我需要实现 Promise.all 的一个版本,它接受一组 promise 并像往常一样返回结果,此外还结算所有 promise ,很像 Promise.settle Bluebird 库中执行此操作,但我不能使用 Bluebird,并且必须仅依赖于标准 promise 协议(protocol)。

实现起来会不会非常复杂?还是在这里询问如何实现它的想法太多了?我真的希望不会,所以我想问,如果有人以前实现过它,请分享如何正确实现的想法。

这样做的前提是能够在调用完成后需要执行commit/rollback的数据库事务中使用它,并且不能松动promises 仍在尝试在事务调用之外解决。

编辑: 提供给另一个问题的链接非常有用,但它并不是所提问题的完整答案。一个通用的 settle 是一个很好的例子,它有很大帮助,但它需要被简化并包装到 all 逻辑中以适应前面描述的事务场景。

最佳答案

我认为 jfriend 的解决方案过于复杂,因为它建立在 settle 之上,它运行一个信号量并做很多奇怪的事情,而不是使用像 这样的内置原语。所有

相反,如果我们构建在 Bluebird 较新的 reflect 原语(在原生 promise 中实现),我们可以获得更简洁的 API 和实现:

function reflect(promise){
return promise.then(x => ({state: "fulfilled", value: x}), // arrows, assume nodejs
e => ({state: "rejected" , value: e}));
}

在 reflect 之上,我们可以轻松构建其他原语:

function settle(promises){
return Promise.all(promises.map(reflect)); // much cleaner
}

如果我们想等待然后根据值解决/拒绝它很简单:

function allWait(promises){
return settle(promises).then(results => {
var firstFailed = results.find(r => r.state === "rejected");
if(firstFailed) throw firstFailed.value;
return results;
});
}

关于javascript - 实现 Promise.all 和 Promise.settle 的混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32468302/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com