Как упростить пример 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();
    });
}
Другие вопросы по тегам