【问题标题】:Putting Togther Q Promises把承诺放在一起
【发布时间】:2017-02-07 03:29:16
【问题描述】:

我正在学习 JS 承诺,并且在理解事物方面取得了一些进展,但不确定如何将其与 return 和使用 Q.all 结合在一起

假设我有一个函数:(getParentsForLocation 返回一个承诺)

    function doBusiness() {

    return Q.all(
    locations.map(function(item, currentIndex) {
         return getParentsForLocation(item.id)
        .then(function(res) {
             return checkParent(res, currentIndex)
          }

        });
    }))
    .then(_.uniq(locations))
  }

然后遵循这一点,即在该映射遍历 locations 数组中的所有元素之后,我想运行类似下划线的 uniq 函数:_.uniq(someArrayIHave);

  1. 我需要把它放在Q.all([]) 中吗? \
  2. 如果是这样,它会按顺序运行该数组中的每个方法吗?
  3. 我想我需要处理 doBusiness() 函数,例如返回一些承诺,但不确定会是什么样子?

任何帮助表示赞赏。

非常感谢。

【问题讨论】:

  • 所以你想等待所有创建的承诺,然后在其他地方(即不在doBusiness(...)函数中),你想在其他数组上调用_.uniq(...),你确认吗?
  • 有一个数组,我希望doBusiness 处理它,然后一旦完成我想调用_.uniq

标签: javascript promise q


【解决方案1】:

我需要把它放在Q.all(…)吗?

是的。您的map() 电话应该会为您带来一系列承诺。

如果是这样,它会按顺序运行该数组中的每个方法吗?

没有。或者至少,我们不知道,他们可以在内部做任何事情。

我想我需要对 doBusiness() 函数做一些事情,例如回报一些承诺

是的。来自我的promise rules of thumb如果一个函数执行异步操作,它必须返回一个承诺。这也适用于你的两个回调函数。

看起来怎么样?

function doBusiness() {
    return Q.all(locations.map(function(item, currentIndex) {
//  ^^^^^^ ^^^^^^
        return getParentsForLocation(item.id)
//      ^^^^^^
        .then(function(res) {
            return updateDB(res, currentIndex);
//          ^^^^^^
        });
    }));
//    ^
}

【讨论】:

  • 谢谢 - 这是有道理的 - 但我应该在哪里打电话给 _.uniq(myArray) - 因为只有在 doBusiness 完成后,myArray 才会准备好?
  • 只需将.then(_.uniq) 放在Q.all() 得到你的承诺之后,它将返回另一个无重复数组的承诺
  • 我已经用我上面的完整代码和你的建议更新了我的问题 - 看起来正确吗?
  • 不,您需要.then(function(locations) { return _.uniq(locations); }).then(_.uniq);总是将函数传递给then。如果res 为空,您的回调不会返回任何内容(即undefined),不确定这是否是您想要的。
  • 好的,最后要真正启动这一切 - 我需要像 Q([doBusiness()]) 这样的代码行 - 因为当我这样做时,我会得到 state: pending
猜你喜欢
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 2018-07-10
相关资源
最近更新 更多