2016-05-05 7 views
0

(PHPからの)Node.jsのコードを書くのはまだ新しく、特に複数のネストされたデータベース呼び出し/非同期操作がある場合、非同期操作が正しく機能するかどうかを理解することができません。 。node.jsのネストされた非同期操作

たとえば、このコード(mongoを使用)では、必要なアカウントにdeletedが設定されている場合にのみプログラムが終了しますか? (todo 1、2および3参照):

// array of account emails to be compared against the accounts already in the database (using `email`) 
var emailsArray; 

accountsDatabase.find({}, {}) 
    .then(function (accountsInDB) { 
     return q.all(_.map(accountsInDB, function (dbAccount) { 
      // compare account's email in db with emails array in memory using .email 
      if ((emailsArray.indexOf(dbAccount.email) > -1) === false) { 

       // todo 1. should there be another 'then' here or is 'return' ok in order for it to work asynchronously? 

       return accountsInDB.updateById(dbAccount._id, {$set: {deleted: true}}); 
      } else { 

       // todo 2. is this return needed? 

       return; 
      } 
     })); 
    }) 
    .then(function() { 

     // TODO 3. WILL THE PROGRAM POTENTIALLY REACH HERE BEFORE `deleted` HAS BEEN SET ON THE REQUIRED ACCOUNTS? 

     callback(); // all of the above has finished 
    }) 
    .catch(function (err) { 
     callback(err); // failed 
    }); 
+1

'callback'パラメータを取る代わりに、あなたが作成した約束を'返す 'だけです。 – Bergi

答えて

2

は別の 'を' はここがなければならないか、それが非同期で動作するためにOK 'を返し' は?

return accountsInDB.updateById(dbAccount._id, {$set: {deleted: true}}); 

あなたは/必要性をチェーン、ここで別のthenを望むことができれば、それは重要ではありません。重要なことは、あなたが待っていることができるように、関数からの約束をあなたがreturnすることです。そうしないと、関数はまだ非同期で動作しますが、順序が乱れています。更新操作を開始した直後に機能します。

この返品が必要ですか?

else 
    return; 

いいえ。 undefinedが返されます。returnも同様です。 elseブランチ全体を省略することができます。

deletedが必要なアカウントに設定される前に、プログラムが実際にアクセスするかどうかを確認します。

callback(); // all of the above has finished 

いいえ、それはしません。 mapは約束事の配列を生成し、q.allはそれらのすべてを待つ(結果の配列を満たす)約束をする。 thenは、チェーンが進む前にコールバックから返されるこの約束を待つでしょう。

+0

すごく感謝していますので、それはそのままでそのまま残しておいてください。 ちなみに、私は今、2番目のreturn文を追加しました: 'return accountsInDB.updateById(dbAccount._id、{$ set:{deleted:false}}); ' – timhc22

+0

私は'コールバック 'のことを避けるでしょう。 .then(...).catch(...) 'の代わりに' .then(function(res){callback(null、res);}、function(err){callback(err);}) ](http://stackoverflow.com/q/24662289/1048572)。しかしそれ以外は大丈夫です。それはうまくいっているよね? – Bergi

+0

素晴らしい、はいそれはうまく動作しているようだ、ヒントと明確化のおかげで:) – timhc22