【问题标题】:ES6/When.js - Handling promise resolution in recursive promise chainES6/When.js - 处理递归承诺链中的承诺解析
【发布时间】:2016-04-02 15:39:48
【问题描述】:

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

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

我能想到的选项:

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

【问题讨论】:

  • 这是预期的输出。要么做另一种方式(不要排队任务),要么提出一个不这样做的承诺模式的实现(并且不符合 ECMAScript 6 承诺规范)。您只需要结果列表中的最后一个值。如果您担心遍历数组,为什么不直接获取它而不是 _.compact
  • @SergiuParaschiv - 非常感谢,这真的很有帮助。我是 Promises 的新手,所以关于“这是预期的”的第二个意见很棒。很有道理。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    我通过使用下划线 _.compact 方法简单地删除“未定义”响应来解决此问题。

    【讨论】:

      猜你喜欢
      • 2017-03-26
      • 2019-09-25
      • 2022-01-22
      • 2016-06-13
      • 2017-07-29
      • 2014-02-04
      • 1970-01-01
      • 1970-01-01
      • 2016-06-29
      相关资源
      最近更新 更多