gpt4 book ai didi

javascript - 如何展平嵌套的 promise 依赖?

转载 作者:行者123 更新时间:2023-11-30 00:10:15 25 4
gpt4 key购买 nike

我正在使用 mondora/asteroid通过节点应用程序通过 promise 模式使用 Meteor DDP。

我将以下代码从回调样式重写为 promise 样式,但我对如何展平它一筹莫展。

asteroid.call('Pony.search', { params })
.then(res => {
if (res.length === 1) {
// something
asteroid.call('Pony.finish', { params })
// this part feels wrong
.then(res => {
// something else
});
} else {
// nope
}
})
.catch(err => {
console.error(err);
});

在第一个 promise 响应中有第二个 asteroid.callthen,这是一个 promise。这部分感觉不对,好像它应该是扁平的而不是嵌套的,但我不确定如何到达那里。

编辑:

最终使用了这样的东西(仍然没有决定是否首先检查 if length === 1 并可能立即拒绝它。有人知道什么是最佳实践吗?

asteroid.call('Pony.search', { params })
.then(res => res.length === 1 ? res : Promise.reject())
.then(res => asteroid.call('Pony.finish', { res[0].something }))
.then(res => {
// do something
})
.catch(err => {
// handle the no found
console.error(err);
});

最佳答案

不是嵌套回调,而是将 promise 与 .then() 连在一起

注意事项:

我不确定您使用的是什么 Promise 库,但我的想法是在出现错误时从第一个 .then() 返回一个被拒绝的 promise,否则返回一个成功的 promise。然后,promise 库将为您处理错误处理,如果存在被拒绝的 promise,则转到 catch block 。

asteroid.call('Pony.search', { params })
.then(res => {
res.length === 1 ? return asteroid.call('Pony.finish', { params }) : Promise.reject();
})
.then(res => {
//do stuff here
})
.catch(err => {
console.error(err);
});

编辑:

唯一的问题是当您需要同时访问 promise 的两个 返回值时。当您展平 promise 链时,您将无法访问之前 promise 的结果。

您有几个选择:

  1. 如果您不需要之前的结果,则像我在这里所做的那样展平 promise 链
  2. 如果确实需要以前的值

    2a。而且你不关心执行顺序然后使用 Promise.all([promise1, promise2])

    2b。如果您确实关心执行顺序,那么您必须像最初那样使用嵌套 promise 。

关于javascript - 如何展平嵌套的 promise 依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36805444/

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