【问题标题】:Promises: Iterating over an arrayPromises:遍历数组
【发布时间】:2015-09-09 09:46:06
【问题描述】:

我正在使用 Sequelize,它使用 Bluebird Promise 并且需要迭代对象数组(一个一个地插入它们 - bulkCreate 无法处理 mssql 上的重复检查)。

看起来像这样:

var users = [.....] // Filled up somewhere else.

Product.create(model)
  .then(function() {
      return users;
  })
  .each(function(user) {
      return User.create(......);
  })

我的问题是:可以像当时那样返回一组东西(不是承诺)吗?

编辑:另一个例子

这是我试图做的另一个更好的例子(除了这是一个 setTimeout() 而不是数据库写入)。它看起来像它的作品。它获取数组中的每个元素(二、三、四)并执行发送到 each() 的函数。

var Promise = require("bluebird");
function myDelay(who) {
    var deferred = Promise.pending();

    console.log("Starting: " + who);

    setTimeout(function() {
        console.log("Done with: " + who);
        deferred.resolve();         
    }, 250);

    return deferred.promise;
}

myDelay("one")
    .then(function() {
        return ["two", "three", "four"];
    })
    .each(function(who) {
        return myDelay(who);
    })
    .then(function() {
        console.log("All done!");
    });

在我看来它工作正常。输出如下所示:

Starting: one
Done with: one
Starting: two
Done with: two
Starting: three
Done with: three
Starting: four
Done with: four
All done!

每个“数字”之间有一个小的延迟。

【问题讨论】:

  • 你想要实现什么 - 代码看起来不起作用 - 它有什么作用吗?
  • 这是伪代码(有点)...我想对数组中的每个项目执行一个数据库插入调用。
  • 如果你返回一个值,它不是来自then() 的 Promise,这个值将被一个 Promise 包裹。所以你的代码不会妨碍你,你打算这样做。
  • 难怪它看起来很破 - 看看这里接受的答案stackoverflow.com/questions/24586110/… - 有一段关于如何在蓝鸟中做你想做的(我认为)
  • @Sirko - 阅读你上面的评论 - 这是伪代码:p

标签: javascript bluebird


【解决方案1】:

是否可以从 then 回调返回一组内容(不是承诺)?

是的,这完全没问题。返回的 Promise 将直接使用该回调返回值进行解析,而不是使用某个 Promise 的结果。 then 作为其同化过程的一部分,会自动区分承诺和非承诺。您在此处返回的 users 数组在这方面与您上次(记录)回调返回的 undefined 没有什么不同。

你的第二个例子完全没问题,只是在你的第一个例子中,我有点担心“在其他地方填满”——你应该尽可能地保持本地化。 users 似乎并不真正依赖于 Product.create(model) 承诺的结果,因此将它们放入该回调中有点奇怪。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-10
    • 2016-01-31
    相关资源
    最近更新 更多