如何展平嵌套承诺依赖项
How do I flatten a nested promise dependency?
我通过节点应用程序使用mondora/asteroid,通过承诺模式使用Meteor DDP。
我有以下代码,我正在从回调样式重写为承诺样式,但卡在如何扁平化它上。
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);
});
在第一个承诺响应中还有第二个asteroid.call
和then
,这是一个承诺。这部分感觉不对,好像它应该是平坦的而不是嵌套的,但我不确定如何到达那里。
编辑:
最终使用了这样的东西(仍然没有决定是否拥有第一个然后检查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);
});
不是嵌套回调,而是将承诺与 .then() 一起链
注意:
我不确定您使用的是哪个 Promise 库,但这个想法是如果出现错误,则从第一个 .then() 返回被拒绝的承诺,否则返回成功的承诺。然后,promise 库将为您处理错误处理,如果有一个被拒绝的承诺,则转到 catch 块。
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);
});
编辑:
唯一的问题是当您需要同时访问承诺的两个返回值时。当您扁平化承诺链时,您将无法访问先前承诺的结果。
您有以下几种选择:
- 如果你不需要之前的结果,那么像我在这里所做的那样拉平承诺链
如果确实需要以前的值
2一.而且您不关心执行顺序,然后使用
Promise.all([promise1, promise2])
2b.而且你确实关心执行的顺序,那么你必须像你最初一样使用嵌套的承诺。
如果承诺是嵌套的,则承诺和回调之间没有区别。
尝试更改代码以使用承诺链:
asteroid.call('Pony.search', { params })
.then(res => {
if (res.length === 1) {
// something
let p1 = asteroid.call('Pony.finish', { params });
return p1;
}
else {
// nope
}
})
.then (function SomeThingElse(res2){
// something else
// res2 is return value from nested asteroid.call
})
.catch(err => {
console.error(err);
});
由于第一个解析处理程序返回一个 Promise p1
,链中下一个函数 (function SomeThingElse
) 的调用被推迟到p1
resolved
。
现在扩展此示例:
asteroid.call('Pony.search', { params })
.then(res => {
if (res.length === 1) {
// something
let p1 = asteroid.call('Pony.finish', { params });
return p1;
}
else {
// nope
}
})
.then (function SomeThingElse(res2){
// something else
// res2 is return value from nested asteroid.call
})
.then (function AnotherFunc(res3){
})
.catch(err => {
console.error(err);
});
如果SomeThingElse
返回一个Promise
,则AnotherFunc
的调用将延迟到该承诺被解决。
如果SomeThingElse
没有返回Promise
,AnotherFunc
将立即被调用,参数与收到的参数相同。换句话说,解析 p1 时会同时调用 SomeThingElse
和 AnotherFunc
。
- 我的职位回报太快了,如何做出承诺
- 打破承诺链的好方法是什么
- 在自定义mean.io包中使用angular-chart.js作为依赖项
- 从函数返回角度承诺
- 为什么Airbnb风格指南说不鼓励依赖函数名称推断
- 我怎样才能获得承诺的价值
- 延期承诺值未更新/解析/延期
- 在承诺链中处理早期回报的最佳方式
- 将依赖外部库的UMD模块与browserfy捆绑在一起
- 如何将本地依赖项添加到npm项目中
- 如何在内联依赖项并将图像转换为dataURI的情况下完全提取网页
- 如何展平嵌套承诺依赖项
- 管理承诺依赖项
- 使用承诺作为数据依赖项的正确方法
- 解析服务依赖项中的承诺
- Q - 在 DAG 中执行一系列承诺并定义它们之间的依赖关系
- 在前端承诺中链接依赖于彼此的服务器调用是不好的做法吗?
- 服务有一个模拟的服务依赖,它返回承诺,在测试中挣扎
- 使用Angular's $q.都是相互依赖的承诺
- 生成一个依赖于递归承诺的承诺