Как упростить пример Q обещания
Я работал над простым приложением, которое выполняет последовательные вызовы ajax, передавая результат первого вызова в следующий.
Конечно, я не хочу идти в ад обратного вызова, и поэтому заглянуть в пример спецификации Promises/A+ и библиотеку Q.
Я подготовил асинхронную функцию, которая должна привести к тому, что я хочу. Но я хочу понять, как я могу упростить последовательное прохождение обещаний.
Сейчас я все еще читаю, как лучше всего работать с обещаниями и отложенными объектами, так что простите за очень наивный код.
Итак, теперь я смотрю на две вещи:
- способ упростить последовательность обещаний (которые зависят друг от друга, как в моем случае)
предложения
var modifyableObject = { toProcess : ["one", "two", "three", "four", "five"] } function returnsDeferredResults(someResult) { var deferred = Q.defer(); // my async function (setTimeout for now will do, $.ajax() later) setTimeout(function () { var nextResult = (someResult || " Initial_Blank_Value ") + "..." + modifyableObject.toProcess[0]; modifyableObject.toProcess = modifyableObject.toProcess.splice(1); console.log("New Tick Result: ", nextResult, "Array: ", modifyableObject.toProcess); deferred.resolve( nextResult); }, 200); return deferred.promise; } //$("#test_promise").click(function () { function getDeferredResult(prevResult) { return returnsDeferredResults(prevResult); } var prevResult = getDeferredResult(); var nextTick = ""; for (var i = modifyableObject.toProcess.length; i > 1; i --) { if (nextTick) nextTick = nextTick.then(getDeferredResult); else nextTick = prevResult.then(getDeferredResult); } //nextTick.fin(function(){ ...}); //}); /* New Tick Result: Initial_Blank_Value ...one Array: ["two", "three", "four", "five"] New Tick Result: Initial_Blank_Value ...one...two Array: ["three", "four", "five"] New Tick Result: Initial_Blank_Value ...one...two...three Array: ["four", "five"] New Tick Result: Initial_Blank_Value ...one...two...three...four Array: ["five"] New Tick Result: Initial_Blank_Value ...one...two...three...four...five Array: [] */
Спасибо всем заранее!
1 ответ
Вы можете упростить свой цикл, комбинируя две переменные:
var nextTick = getDeferredResult();
for (var i = modifyableObject.toProcess.length; i > 1; i --) {
nextTick = nextTick.then(getDeferredResult);
}
Или же,
return modifyableObject.toProcess.reduce(function(promise, item) {
return promise.then(getDeferredResult);
}, Q.resolve());
Вы также можете упростить свою функцию:
return Q.delay(200).then(function) {
return "..." + modifyableObject.toProcess.shift();
});
JQuery AJAX также возвращает обещание, с которым совместим Q (в последних версиях jQuery)
Затем вы можете объединить два улучшения, передав каждый элемент функции:
return modifyableObject.toProcess.reduce(function(promise, item) {
return promise.then(processItem.bind(null, item));
}, Q.resolve());
function processItem(item) {
return Q.delay(200).then(function) {
return "..." + modifyableObject.toProcess.shift();
});
}