このコードを実行するより良い方法があるかどうか調べたいと思います。私は2つのファイルを処理し、データベースに保存しようとしています。私はオーダー(親)を処理したいと思いますし、完了したら子レコードを処理しました。 DBがレコードをロックしている場合は、2秒待ってからもう一度やり直してください。 私はそれをこのように動作させましたが、私はそれをより良くする方法を知りたいと思います。 P.P.私は非同期を使用することはできません - 私は改善するために何ができる最高のモジュールパターンを作成することです非同期ループを保留して処理を続行します
var orderItems = [1, 2, 3];
var tries = 0;
saveOrder()
.then(function() {
console.log('Done Order');
try {
asyncLoop(orderItems.length, nextItem, success);
}
catch(e) {
console.log(e);
}
})
.catch (console.log);
function nextItem(loop) {
saveItems(loop.iteration())
.then((msg) => {
console.log(loop.iteration());
loop.next();
})
.catch((e) => {
if (e instanceof String) console.log('Catched !!');
console.log(e);
tries = 1;
waitNTryAgain().then(() => { console.log('Trying again!'); nextItem(loop); });
});
}
function waitNTryAgain() {
return new Promise((resolve, reject) => {
setTimeout(resolve, 2000, 'Done waiting');
});
}
function success() {
console.log('Done asyncLoop!');
}
function saveOrder() {
return new Promise((resolve, reject) => {
setTimeout(resolve, 2000, 'Save Order Done!');
});
}
function saveItems(itemNumber) {
return new Promise((resolve, reject) => {
if (itemNumber == 1 && tries == 0) {
setTimeout(reject, 4000, 'DbLockedException');
}
else {
setTimeout(resolve, 4000, 'Save Item#: ' + itemNumber + ' Done!');
}
})
}
function asyncLoop(iterations, func, callback) {
var index = 0;
var done = false;
var loop = {
next: function() {
if (done) return;
if (index < iterations) {
index++;
func(loop);
}
else {
done = true;
callback();
}
},
iteration: function() {
return index - 1;
},
break: function() {
done = true;
callback();
}
};
loop.next();
return loop;
}
[codereview.SE]の質問によく似ています。 – Bergi
なぜ、 'async' /' await'を使用できないのですか? ES6発電機を使用できますか? – Bergi
あなたの 'asyncLoop'関数は、コールバックを取るのではなく、約束を返すべきです。 – Bergi