web-dev-qa-db-ja.com

ブルーバードの約束-各機能

助けてくれてありがとう。

BluebirdのPromiseを使用している間、一連のPromiseを実行しています。最後の約束の間に、配列内のオブジェクトごとに1つの関数を複数回実行したいと思います。

以下に擬似コードがあります。

var userArray = [ 
    {
        name: "John",
        email: "[email protected]"

    },
    {
        name: "Jane",
        email: "[email protected]"
    }]; 

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を使用してこれを実装する正しい方法は何ですか?

9
Jay

助けてくれてありがとう@ Roman @ Yuri!私の現在機能しているコードは以下のとおりです。

var userArray = [ 
{
    name: "John",
    email: "[email protected]"

},
{
    name: "Jane",
    email: "[email protected]"
}]; 

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");
    });
2
Jay

私が理解しているように、配列から要素に対していくつかの非同期アクションを実行したいとします。次に、次の例を確認してください。

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");
  });

また、「each」ではなく「all」を使用することをお勧めします

以下の例を確認してください。

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

または

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

「all」は、すべてのアクションが正しく実行された場合に通知します。

Promiseの使用方法(ベストプラクティス):

http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.htmlhttps://blog.domenic.me/youre-約束のポイントがない/

14
Roman Sachenko

最も簡単な実装:

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");
    });

これらすべての作成の結果にアクセスする場合は、.eachではなく.mapを使用する必要があります。

5
Yuri Zarubin