當然,這是很容易做到
var _p = null; // just a cache
function batchRequests(fn){
if(_p != null) return _p; // if we have an in-flight request, return it
_p = fn(); // otherwise start a new action
_p.then(function(){ _p = null; }, // delete cache on resolve
function(){ _p = null; }); // even on failure
return _p; // return the new in-flight request
}
它可以讓你做的事:
function delay(){ // just for example, simulate a request
return new Promise(function(resolve){ setTimeout(resolve, 1000); });
}
var batched = function(){ return batchRequests(delay); };
batched().then(function(){ console.log("All these"); });
batched().then(function(){ console.log("execute after"); });
batched().then(function(){ console.log("one second, at the same time"); });
如果您更詳細地描述你試圖解決實際問題(包括對您的代碼兩個操作),而不是描述你自己的解決方案(參見[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)),我們可以告訴你如何正確使用promise來處理它。 – jfriend00
@ jfriend00在這種模式適用的情況下有很多用例,並且不是XY問題:例如,多位代碼執行相同的請求,並且您不想爲每個請求啓動新的請求,但也不會想要緩存值,因爲它可能會改變。 –
@BenjaminGruenbaum - 你猜測OP要什麼,你只能爲你的猜測提供一個通用的解決方案。如果OP提供了他們的實際問題和他們實際代碼的例子,我們不必猜測他們正在嘗試做什麼,並且可以提供更多更具體的答案。我建議OP如何讓他們的問題成爲一個更好的問題,這將會提供更具體的答案,而不需要猜測他們想要什麼。你可能猜對了,我真的不確定。但是,任何需要猜測的問題都可能會更好。 – jfriend00