2013-03-08 24 views
2

比方說,我有一個異步函數返回一個承諾。我想鏈接很多這些函數,每個函數都有不同的參數。如何構建jquery promise的數組?

功能,將執行此數組是這樣的:

function executePromiseQueueSync(queue){ 
    var seed = $.Deferred(), 
     finalPromise; 

    _reduce(queue, function(memo, promise){ 
     return memo.then(promise); 
    }, seed.promise()); 

    seed.resolve(); 
    return finalPromise; 
} 

我看到了一些功能,接受承諾的數組,並同步執行它們。問題是我不知道如何創建這樣一個數組。例如:

var promiseQueue = []; 
promiseQueue.push(AsynchEvent(someArg)); // WRONG: this is function call and will be executed immediately 

另:

var promiseQueue = []; 
promiseQueue.push(AsynchEvent); // WRONG: at some point I will have to apply this with arguments 

所以 - 有沒有把一個函數返回一個承諾到一個數組但不執行的方法嗎?在您編輯後

+0

查看[bind](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind)函數。 – 2013-03-08 09:20:27

+0

看看編輯後的問題,函數「executePromiseQueueSync」。在這種情況下綁定會如何幫助我? – mnowotka 2013-03-08 09:47:56

+0

承諾沒有執行,很難確切知道你想要達到的目標。建議你嘗試用直截了當的術語來解釋,而不是假設一個特定的解決方案。 – 2013-03-09 00:48:40

回答

1

更新:

那麼,如果你包括從一開始就信息這將是很好,所以這裏去嘗試。

我假設第一個輸入是已知的,並且最後一個函數的返回應該進入列表中的下一個。

在我們仍然定義並添加到隊列以前一樣的話:

var promiseQueue = []; 
promiseQueue.push(AsynchEvent); 

但是,我們將需要修改循環升技。我將把它變成一個函數,只是爲了說明如何使用它。

function calcPromise(initialArg) { 
    aggregateArg = initialArg; 
    for (var i = 0; i < myStringArray.length; i++) { 
    aggregateArg = promiseQueue[i](aggregateArg); 
    } 
    return aggregateArg; 
} 

請記住,這是JavaScript的 - 你從一個函數返回的內容並反饋到下一個可能是這個函數的兩次迭代之間完全不同。 例如

  • promiseQueue [0]可以期待一個int並返回一個JSON結構體。
  • promiseQueue [1]可以期待一個JSON結構並返回一個字符串。
  • 等等。
+0

再次看看這個問題 - 現在編輯它。你會看到我的問題。 – mnowotka 2013-03-08 09:47:03

+0

哦,是的 - 也許我應該讓你知道。我已經更新了答案。 – fredrik 2013-03-08 20:53:34