2013-07-31 33 views
15

我無法通過所有參數。我的承諾回調只接收一個而不是三個:javascript承諾不通過所有參數(使用Q)

var asyncFunction= function(resolve) { 
    setTimeout(function() { 
     resolve("Some string that is passed", "and another", "third"); 
    }, 1000); 
}; 

var promiseFunction = function() { 
    var deferred = Q.defer(); 

    asyncFunction(deferred.resolve); 

    return deferred.promise; 
}; 

promiseFunction().then(function() { 
    // Only one argument is passed here instead of 3 
    // { '0': 'Some string that is passed' } 
    console.log(arguments); 
}); 

任何想法我做錯了什麼?

+0

我的錢是強制類型 –

回答

12

Q承諾可以是resolve d只有一個參數 - 承諾代表一個單一的值,而不是它們的集合。如果您需要多個值,請將它們明確放入數組中。對於多參數回調,您可以使用.spread()

+1

這怎麼可能?有數以千計的具有異步函數的庫返回多個參數?他們不能被使用嗎? – Nick

+0

只用一個包裝看起來。你有沒有特別的想法? – Bergi

+0

@Nick整個圖書館都圍繞着單一價值的方法。 [查看源代碼](https://github.com/kriskowal/q/blob/424dbd1f8c4a6a40a4b2c341598955b3880bfe79/q.js#L571),並試圖找出需要更改以支持多個值。你會很驚訝,這很複雜,而很少或沒有真正的價值。正如Bergi所建議的那樣使用一個數組。 – Tomalak

2

同步函數只返回一個值,異步應該用同一個方法解決。

創建使用多個值解析的異步函數是一種不好的做法。如果你想傳遞許多值,請將它們返回到數組或字典對象中,如果給定的函數是同步的,那麼也是一樣。

+1

大量的庫使用回調傳回多個參數;我不認爲這是不好的做法。支持多種價值的承諾/期貨似乎也是合乎邏輯的一步。我想這應該被探索,這個[郵件列表條目](http://lists.w3。組織/檔案館/公共/ WWW-DOM/2013AprJun/0059.html)。 – Matt

+0

馬特,最初在圖書館我保持我試驗了多個值的解決方案,但我很快拒絕了這個想法。我現在不記得確切的問題,但我相信有些情況下,我需要將解決的值作爲一個對象來處理,而且它總是處理數組或參數對象,這很奇怪(而且與同步函數不同) 。 決定已經被創造出來並被證明在實踐中是正確的。你看到的帖子很快就被放下了。我不記得這個想法被認真考慮過了。 –

+0

我只關心,因爲我正在寫承諾庫(用於娛樂和學習),而多重解析參數對我來說就像是一種自然的解決方案。如果社區已經解決了一個單一的價值,那麼我想。感謝後續。 – Matt

0

如果您想傳遞多個值,則必須將它們包裝在您傳遞的另一個值中,例如數組或對象。