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

时间:2015-12-28 19:24:47

标签: javascript node.js recursion promise es6-promise

我有一个递归的promise链,即调用自身直到值等于零。这很好用但是当它最终解决时,输出会附加“未定义”值,大概是每个未解析的promise调用值。

问题:有人可以就最佳做法提出建议,以处理预期未解决的值吗?

我能想到的选项:

1)在结果集中处理这些,即删除未定义的值,例如

_.compact(response)

这不是正确的选择,但可能是?

2)抛出一个由捕获处理的异常。

感谢任何想法 - 代码骨架,以帮助说明下面的问题。

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) {
        ....
};

2 个答案:

答案 0 :(得分:0)

感谢@SergiuParaschiv的评论,这是预期的行为。

我通过简单地删除" undefined"使用下划线_.compact方法的响应。

答案 1 :(得分:0)

对于初学者,我发现你的代码存在两个问题:

  • 当条件_.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) {