ES6/When.js-在递归承诺链中处理承诺解析

ES6/When.js - Handling promise resolution in recursive promise chain

本文关键字:承诺 处理 递归 When js- ES6      更新时间:2023-09-26

我有一个递归的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方法简单地删除"未定义"的响应来解决这个问题。