什么';我的javascript承诺代码有什么问题

什么';我的javascript承诺代码有什么问题,javascript,promise,Javascript,Promise,我想自己实现一个javascript承诺来理解这个机制,这是我的代码,但是它报告了未定义的错误,有人能帮我看看吗 var Promise = function(){ this.successesCallback = []; } Promise.prototype.then = function(success){ console.log("add success"); this.successesCallback.push(success); } var Defer

我想自己实现一个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")});
var Promise=function(){
this.successScalBack=[];
}
Promise.prototype.then=函数(成功){
console.log(“添加成功”);
此.successcalback.push(成功);
}
var Defer=function(){
this.promise=newpromise();
}
Defer.prototype.resolve=函数(){
log(“正在调用延迟解析”);
console.log(“2promise of delay:+this.promise)
此.promise.successcalback[0]();
}
var remoteCall=函数(回调){
对于(变量i=0;i<100000000;i++){
}
回调();
}
var callRemote=函数(){
var defer=new defer();
console.log(“延迟承诺:+延迟承诺”)
log(“为远程调用设置计时器”);
setTimeout(函数(){remoteCall(defer.resolve)},0);
console.log(“远程调用被触发”);
回报、承诺;
}
callRemote().then(function(){console.log(“你好,服务器调用完成”)});

setTimeout()
回调中,
defer
resolve()
之间的绑定丢失后,可以按节点运行

一种解决办法是使用:


setTimeout()
回调中,您失去了
defer
resolve()
之间的绑定,如另一个答案中所述。现在,您可以使用
()=>
而不是
function()
来维护自ES6以来的当前绑定

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

添加更多关于您的问题以及您已经尝试解决问题的细节。哇,您的承诺代码中有很多错误。首先,您的承诺没有正确地实现
then
,因为您无法从
then
返回承诺,没有错误处理(catch),承诺链中的错误无法从中恢复。请查看链接到的一些最小“承诺”库,看看您的“实现”距离有多远一个众所周知的规范就是这样。非常感谢。@JasonDou如果一个答案解决了你的问题,请用旁边的复选标记“接受”,这样其他人就可以看到问题已经解决了。
setTimeout(()=>{remoteCall(defer.resolve)}, 0);