1

最初の呼び出しの結果を次の呼び出しに渡す、連続した ajax 呼び出しを行う単純なアプリケーションに取り組んでいました。

もちろん、コールバック地獄には行きたくないので、Promises/A+仕様の例とQ ライブラリを調べます。

必要な結果になるはずの非同期関数を用意しました。しかし、Sequential promise の受け渡しを単純化する方法についての洞察が必要です。

今のところ、promise と deferred オブジェクトを最適に操作する方法についてまだ読んでいます。非常に素朴なコードを許してください。

だから今、私は2つのことを見ています:

  • promise の順序付けを単純化する方法 (私の場合のように互いに依存しています)
  • 提案

    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:  [] 
    */
    

よろしくお願いします!

4

1 に答える 1

5

2 つの変数を組み合わせることで、ループを単純化できます。

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 も promise を返します。これは、Q と互換性があります (最近のバージョンの jQuery では)。

次に、各項目を関数に渡すことで、2 つの改善を組み合わせることができます。

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();
    });
}
于 2013-07-03T15:51:36.237 に答える