簡體   English   中英

我的JavaScript Promise代碼怎么了

[英]what's wrong with my javascript promise code

我想自己實現一個JavaScript諾言以了解該機制,這是我的代碼,但是它報告了未定義的錯誤,有人可以幫我看看嗎?

var Promise = function(){
    this.successesCallback = [];
}

Promise.prototype.then = function(success){
    console.log("add success");
    this.successesCallback.push(success);
}

var Defer = function(){
    this.promise = new Promise();
}

Defer.prototype.resolve = function(){
    console.log("defer resolve is calling");
    console.log("2promise of defer:" + this.promise)
    this.promise.successesCallback[0]();
}

var remoteCall = function(callBack){
    for(var i = 0; i < 1000000000; i++){
    }
    callBack();
}

var callRemote = function(){
    var defer = new Defer();
    console.log("promise of defer:" + defer.promise)
    console.log("set timer for remote call");
    setTimeout(function(){remoteCall(defer.resolve)}, 0);
    console.log("remote call is triggered");

    return defer.promise;
}

callRemote().then(function(){console.log("Hello, server call done")});

您可以按節點運行

您將丟失setTimeout()回調中的deferresolve()之間的綁定。

一種解決方案是使用bind()

setTimeout(function(){remoteCall(defer.resolve.bind( defer )}, 0);

如另一個答案中所述,您將在setTimeout()回調中丟失deferresolve()之間的綁定。 現在,您可以使用()=>而不是function()來維護自ES6以來的當前綁定。

setTimeout(()=>{remoteCall(defer.resolve)}, 0);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM