【问题标题】:Bluebird promises - each functionBluebird 承诺 - 每个功能
【发布时间】:2015-10-23 03:52:03
【问题描述】:

提前感谢您的帮助。

在使用 Bluebird Promise 时,我运行了一系列 Promise。在最后一个承诺期间,我想为数组中的每个对象多次运行一个函数。

下面是伪代码:

var userArray = [ 
    {
        name: "John",
        email: "John@email.com"

    },
    {
        name: "Jane",
        email: "jane@email.com"
    }]; 

var functionOne = function() {
    //returns Promsie object
};

var functionTwo = function() {
    //returns promise object
};

var createUser = function(user) {
    return User.findOrCreate({email: user.email},{
        name: user.name,
        email: user.email
    });
};

functionOne()
    .then(functionTwo)
    .each(createUser(userArray))
    .then(function onComplete() {
        console.log("Complete");
    })
    .catch(function onError() {
        console.log("Um...it's not working");
    });

我知道我没有正确使用每个功能。使用 Bluebird 实现这一点的正确方法是什么?

【问题讨论】:

  • 你想在each 上迭代的数组是什么?是functionTwo返回的还是userArray返回的?
  • @Sosdoc 我想在 userArray 上进行迭代
  • 你必须传递一个回调函数给each,而不是一个promise。

标签: node.js promise sails.js bluebird


【解决方案1】:

据我了解,您希望对数组中的元素采取一些异步操作。然后请检查以下示例:

var Promise = require('bluebird');

function createUsersFromArray(userArray){
    return Promise.each(userArray, function(signleUser){
        return createUserFunction(signleUser);
    });
}

return Promise.each(userArray, createUserFunction);

functionOne()
  .then(functionTwo)
  .then(function(){
      return createUsersFromArray(userArray);
  })
//or just .then(createUsersFromArray) if functionTwo return this array
  .then(function(createdUsers){
      //here you may retrieve users and make some magic with them
      console.log(createdUsers);
  })
  .then(function onComplete() {
      console.log("Complete");
  })
  .catch(function onError() {
      console.log("Um...it's not working");
  });

我还建议使用“all”而不是“each”

查看以下示例:

return Promise.all(userArray.map(function(singleUser){
    return doSomethingWithUser(singleUser);
}));

return Promise.all(userArray.map(doSomethingWithUser));

如果所有操作都正确执行,'all' 会通知您。

如何使用承诺(最佳实践):

http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html https://blog.domenic.me/youre-missing-the-point-of-promises/

【讨论】:

  • 感谢您的回复。在您的第二个代码块中,“createUserFunction”函数返回 Promise 还是 User 对象?
  • @Jay 该函数返回promise,但如果该函数返回这些用户,您可以检索用户。所以我想告诉你以下内容。如果您的“createUsersFromArray”函数返回/解析创建的用户,那么您可以在下一个“then”语句中检索该用户,例如createUsersFromArray(userArray) .then(function(createdUser){ console.log(createdUser) }); 我也更新了我的答案,请检查“onComplete”之前的函数
【解决方案2】:

最直接的实现:

functionOne()
    .then(functionTwo)
    .then(function(){
      return bluebird.each(userArray, createUser);
    })
    .then(function onComplete() {
        console.log("Complete");
    })
    .catch(function onError() {
        console.log("Um...it's not working");
    });

如果您想访问所有这些创建的结果,您应该使用 .map 而不是 .each。

【讨论】:

    【解决方案3】:

    感谢@Roman @Yuri 的帮助!我现在工作的代码如下:

    var userArray = [ 
    {
        name: "John",
        email: "John@email.com"
    
    },
    {
        name: "Jane",
        email: "jane@email.com"
    }]; 
    
    var functionOne = function() {
        //returns Promise object
    };
    
    var functionTwo = function() {
        //returns Promise object
    };
    
    var createUser = function(singleUser) {
      //returns Promise object containing creating User
    };
    
    functionOne()
        .then(functionTwo)
        .then(function() {
          return Promise.map(userArray, createUser);
        })
        .then(function onComplete(response) {
            console.log("Complete:" + JSON.stringify(response));
        })
        .catch(function onError() {
            console.log("Um...it's not working");
        });
    

    【讨论】:

      猜你喜欢
      • 2016-02-08
      • 2016-07-27
      • 1970-01-01
      • 1970-01-01
      • 2018-02-01
      • 2013-10-26
      • 2017-04-08
      • 2015-05-11
      • 1970-01-01
      相关资源
      最近更新 更多