1

看看這個jQuery代碼:JavaScript的原生無極()沒有回調

var promise = new Deferred(), 
    some; 

some = function(promise) { 
    // do cool things 

    promise.resolve(); 
}; 

promise.then(/* callback cool things */); 

// init everything 
some(promise); 

我不知道這種方法的架構正確性,但我用了很長一段時間,這是方便我。

在原生JavaScript中我不能使用這種方法。構造函數new Promise()需要回調參數,所以我無法將Promise的實例作爲參數傳遞。

所以我的問題是:我如何預定義JavaScript本地承諾,將其作爲參數傳遞給函數和決心?

+0

@ user2864740我知道這是一箇舊評論,但這是一個笑話嗎? – Mathletics

+0

@Mathletics沒有。這是一個嚴肅的評論,說明了一個無效的(最近修復的)拼寫,目的是從原作者開始修正。 – user2864740

+0

@Mathletics謝謝) –

回答

2

的執行流程會有點不同,但基本的工作方式相同:

function some(resolve, reject) { 
    resolve(); 
} 

var promise = new Promise(some); 

promise.then(/* callback cool things */); 

而不是some獲得通過的承諾本身,它就會通過resolvereject功能。所以,依賴只是另一回事。

0

這裏有一個基本的實現,它可以保持您的應用程序流程。

不要在現實生活中使用這個 - 你會錯過安全的拋出(感謝@BenjaminGruenbaum的提示)。

var MyDeferred = function() { 
    var _resolve, 
     _reject, 
     capturedPromise = new Promise(function(resolve, reject){ 
      _resolve = resolve; 
      _reject = reject; 
     }); 

    return { 
     'resolve' : _resolve, 
     'reject' : _reject, 
     'then' : function() { capturedPromise.then.apply(capturedPromise, arguments); }, 
     'catch' : function() { capturedPromise.catch.apply(capturedPromise, arguments); } 
    } 
}; 
+0

@Felix答案對我來說比較可以接受,不過無論如何謝謝你的實現 –

+0

請不要這樣做。有一個原因延遲對象是壞的,並承諾構造更好(扔安全)。 –

+0

@BenjaminGruenbaum:謝謝你的指針! – vzwick