gpt4 book ai didi

javascript - 你能 "accumulate" promise 导致 "then"链吗?

转载 作者:行者123 更新时间:2023-12-01 08:29:00 24 4
gpt4 key购买 nike

假设您必须链接返回 promise 的函数,其中每个函数都需要 一些(不一定是最后一个)其他 promise 返回的值。

这个模式有名字吗,用 promises 干净可行吗?

例如:

return getA().then(function (a) {

getB(a).then(function (b) {

getC(a, b).then (function (c) {
return {
a : a,
b : b,
c : c
}
});
});
});

你不能“天真”地把它弄平:

getA().then(function (a) {
return getB(a);
}).then(function (b) {
// Obviously won't work since a is not there any more
return getC(a, b);
}).then(function (c) {
// Same game, you can't access a or b
});

我能看到的唯一替代方法是 getA、getB 和 getC 实际上返回一个 Promise,该 Promise 由一个包含 a、b、c 的对象解析。 (所以每个函数都会构建它是最终结果的一部分。)

getA().then (function (result) {
return getB(result.a);
}).then(function (result) {
return getC(result.a, result.b);
}).then(function (result) {
// Last function is useless, just here to illustrate.
return result;
});

在我的第一个示例中,有没有办法将代码展平?

最佳答案

这里有一些你实际上并不需要的东西:

  • 额外的闭包变量
  • 任何嵌套。或者嵌套 Promise.all 调用
  • 实现复杂的逻辑

这里的技巧是使用 Promise 作为 值的代理,这可以让您像使用其他顺序代码一样逐行执行此操作。这是“ native 展平”:

var a = getA();
var b = a.then(getB);
var c = Promise.all([a,b]).spread(getC); // .all with a lambda if no .spread

现在假设您要访问 a bc:

// .then and unwrap arguments if no spread, in Bluebird it's even better with join
Promise.all([a,b,c]).spread(function(a, b, c){
//a b and c are available here, note how we didn't need to nest
});

关于javascript - 你能 "accumulate" promise 导致 "then"链吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25431912/

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