2016-10-16 9 views
0

ノードjにはまだ経験はありませんが、私は学んでいます。ノードJS Array、Foreach、Mongoose、Synchronous

だから私の問題。例: 私はmongooseとasyncモジュールで小さなアプリを持っています。ユーザーコレクションのmongodbには、1人のフィールドバランス= 100のユーザーがいます。

var arr  = [1,2,3,4]; 
var userId = 1; 
async.forEachSeries(arr, (item, cb) =>{ 
    async.waterfall([ 
     next => { 
      users.findById(userId, (err, user) =>{ 
       if (err) throw err; 
       next(null, user) 
      }); 
     }, 
     (userResult,next) =>{ 
      var newBalance = userResult.balance - item; 
      users.findByIdAndUpdate(userId, {balance:newBalance}, err =>{ 
       if (err) throw err; 
       next(null, userResult, newBalance); 
      }) 
     } 

    ],(err, userResult, newBalance) =>{ 
     console.log(`Old user balance: ${userResult.balance} New user balance: ${newBalance}`); 
    }); 
    cb(null) 
}); 

と私は

Old user balance: 100 New user balance: 98 
Old user balance: 100 New user balance: 99 
Old user balance: 100 New user balance: 97 
Old user balance: 100 New user balance: 96 

だから基本的に非同期async.waterfallを呼び出しているforeachのような結果を受けています。私の質問どのようにforeyncを行うにはアイテムごとに、私はそれぞれの、forEach、eachSeries、約束の有無にかかわらず試しました。

Old user balance: 100 New user balance: 99 
Old user balance: 99 New user balance: 97 
Old user balance: 97 New user balance: 94 
Old user balance: 94 New user balance: 90 

は、最終的なコールバックが呼ばれましたどこに問題がある

答えて

1

ありがとう最後に、このような結果を取得する必要があります。

var arr  = [1,2,3,4]; 
var userId = 1; 
async.forEachSeries(arr, (item, cb) =>{ 
    async.waterfall([ 
    next => { 
     users.findById(userId, (err, user) =>{ 
      if (err) throw err; 
      next(null, user) 
     }); 
    }, 
    (userResult,next) =>{ 
     var newBalance = userResult.balance - item; 
     users.findByIdAndUpdate(userId, {balance:newBalance}, err =>{ 
      if (err) throw err; 
      next(null, userResult, newBalance); 
     }) 
    } 

],(err, userResult, newBalance) =>{ 
    console.log(`Old user balance: ${userResult.balance} New user balance: ${newBalance}`); 
    cb(null); // <<==== call here 
}); 
// cb(null); // <<==== NOT call here 

}); cb()をコールバックする必要があります。

+0

非常にありがとうございます!それは今通りに動作します! – billibob

関連する問題