条件が満たされてから残りの部分をスキップするまで配列の各要素をテストしたい。これは私が思いついたコードです、それは働いているようですが、私は実際に安全か予期しない副作用があるか分かりません。他の解決策が歓迎される。Bluebird.eachが解決したらブレークする
let buddyAdded = false;
replicaArr = _.keys(ReplicaList);
Promise.each(replicaArr, function(replicaname) {
if (!buddyAdded) {
Player.count({
'buddyList': replicaname
}, function(err, result) {
if (err) {
} else if (result < 990) {
Player.update({
'_id': buddyObj.buddyId
}, {
'buddyList': replicaname
}, function(err) {
if (err) {
} else {
ReplicaList[replicaname].send(buddyObj);
buddyAdded = true;
// success stop here and skip all the other array elements
return;
}
});
}
});
}
});
:
最初の約束はtruthy値に解決するときに停止独自のシーケンサーを作るほうが簡単かもしれません。 count() 'と' Player.update() 'は非同期操作ですが、これは正しく動作しません。 '.each()'へのコールバックは、コールバックの非同期操作を表す約束を返す必要があります。あなたが持っている方法では、コールバックコードの外側から、いつ完了したかを知る方法はありません。また、Bluebirdを使用しているので、 'Promise.any()'を使用して、必要な方法を解決する最初の値を取得できます。 – jfriend00
より良い方法を提供するには、達成しようとしていること、厳密なシリアル順で配列を処理するかどうか、複数のプレーヤーを並行して処理できるかどうか、あなたが達成しようとしている正確な結果。 – jfriend00
@ jfriend00利用可能なボットの配列を調べ、それらのどれが友人リストに残っているかを確認する必要があります。 Model.countを使用して、リストにある現在の友人数を取得します。理想的には、配列内にある順序でチェックするのが理想的です。空のスロットを持つボットが見つかったら、ボット名をデータベースに保存します。その操作が成功すると、約束が解決され、他のすべての反復/要素はスキップされます。 – Trax