ES6/When.js-在递归承诺链中处理承诺解析
ES6/When.js - Handling promise resolution in recursive promise chain
我有一个递归的promise链,即调用自己直到值等于零。这非常有效,但是当它最终解析时,输出会附加"未定义"的值,可能每个未解析的promise调用都有一个值。
问题:有人能就处理预期未解决值的最佳实践提出建议吗?
我能想到的选项:
1) 在结果集中处理这些,即删除未定义的值,例如
_.compact(response)
这感觉不是一个正确的选择,但可能是吗?
2) 抛出要由catch处理的异常。
感谢任何有助于说明以下问题的思想代码框架。
const queueTask = function queueTask(task) {
...
}).then(response => {
if (_.has(task, 'another')) {
let taskConfigs = doSomething(task);
//Add new tasks to queue. Return a promise that will resolve
//only once all the items in array have resolved.
return when.all(taskConfigs.map(function(each) {
return queueTask(each);
}));
}
if (task.remainingTasks === 0) {
return response;
}
}).catch(function (err) {
....
};
对于初学者来说,我发现您的代码有两个问题:
-
当条件
_.has(task, 'another')
和task.remainingTasks === 0
都为假时,您想要什么样的响应,猜测这是undefined
值的来源。 -
您直接返回
when.all
响应,它是一个数组,这是您想要的吗?
我会将您的代码修改为:
}).then(response => {
if (_.has(task, 'another')) {
let taskConfigs = doSomething(task);
return when.all(taskConfigs.map(function(each) {
return queueTask(each);
})).then(resultArray => response); // or whatever kind of result you want to post.
}
return response;
}).catch(function (err) {
感谢@SergiuParaschiv的评论,这是意料之中的行为。
我通过使用下划线_.compact
方法简单地删除"未定义"的响应来解决这个问题。
相关文章:
- 在承诺链中处理早期回报的最佳方式
- Nodejs和express路由,如何处理客户端的承诺
- 如何在多承诺链中处理谷歌地图API V3事件
- 当链接javascript承诺时,如何处理then()函数中的条件
- 我能处理来自gap.client.load'的错误吗;的承诺
- $q.reject和处理AngularJS链接承诺中的错误
- EmberJS:在成功处理请求时解决承诺
- 如何正确处理承诺
- 处理角度.js承诺错误状态
- Chai正如承诺:当承诺抛出错误时,处理错误
- 将承诺处理程序绑定到其类的更好方法
- 为什么在单元测试中注入“ng”会改变承诺处理行为
- 链接多个承诺(处理回调)
- Javascript承诺处理404
- 如何使用JS承诺处理异步调用
- 使用A+承诺处理预期错误和操作错误
- 将承诺处理函数绑定到对象
- 用承诺处理分支
- 使用Bluebird进行异步承诺处理
- 嵌套承诺处理程序