Javascript 不使用jquery实现延迟对象

Javascript 不使用jquery实现延迟对象,javascript,jquery,jquery-deferred,deferred,Javascript,Jquery,Jquery Deferred,Deferred,我想在不使用jQuery的情况下实现基本的延迟对象。在这里,我将使用resolve和reject函数只实现done和fail回调。当然,将promise方法与此函数相关联 我正在纯js(已编辑)中执行以下实现: 但是上面给出了错误:Object#没有方法“fail” 我知道Deferred()函数的返回对象“d”没有方法done()。如果我从Deferred()返回d.promise,则不会有解析和拒绝函数 请指出我在实现延迟对象的简单目标时犯了什么错误 下面是我正在做的事情:我认为最好在调用回

我想在不使用jQuery的情况下实现基本的延迟对象。在这里,我将使用resolve和reject函数只实现done和fail回调。当然,将
promise
方法与此函数相关联

我正在纯js(已编辑)中执行以下实现:

但是上面给出了错误:
Object#没有方法“fail”

我知道
Deferred()
函数的返回对象“d”没有方法done()。如果我从
Deferred()
返回d.promise,则不会有解析和拒绝函数

请指出我在实现延迟对象的简单目标时犯了什么错误


下面是我正在做的事情:

我认为最好在调用回调后取消分配回调,以避免内存泄漏,并立即执行稍后添加的回调

函数延迟(){
让thens=[]
让我们捕捉=[]
让状态
让resolvedValue
让被拒绝的错误
返回{
解析:值=>{
状态='已解决'
resolvedValue=值
thens.forEach(t=>t(值))
thens=[]//避免memleaks。
},
拒绝:错误=>{
状态='已拒绝'
rejectedError=错误
forEach(c=>c(错误))
catch=[]//避免memleaks。
},
然后:cb=>{
如果(状态==‘已解决’){
cb(解析值)
}否则{
然后,取消移位(cb)
}
},
捕获:cb=>{
如果(状态==‘已拒绝’){
cb(拒绝错误)
}否则{
渔获量.取消提升(cb)
}
},
}
}
常数d=延迟()
设置超时(()=>{
d、 决心(“好”)
}, 1000)
//将在1s后调用
d、 然后(value=>console.log('1已解析!',value))
设置超时(()=>{
//将在3s后调用,并立即执行,因为它已经解决
d、 然后(value=>console.log(“#2已解析!”,value))

},3000)
如果使用
new
创建实例,则应将方法添加到
原型中。构造函数返回一个实例,即使您
返回d
。您可能需要
var d=Deferred()
您没有名为done的方法。如果你看着你的目标,你就有决心、拒绝和承诺。setVal()使用这3个方法返回对象的实例。jQuery不是唯一一个实现承诺的库。我错把前面的coed。。请查看新编辑的代码..@JayC,我想用纯js实现。(作为一个约束,我必须遵循)…如果您想更接近jQuery行为,您可能需要添加一个“promise”函数,该函数返回一个只包含“done”和“fail”的对象(这样调用函数就不会有解析/拒绝的权限)。另外-您可以从“完成/失败”返回“this”,以允许链接。
function Deferred() {
    var d = {};
    d.resolve = function() {
        d.done(arguments);
    }
    d.reject = function() {
        d.fail(arguments);
    }
    d.promise = function() {
        var x = {};
        x.done = function(args) {
            return args;
        }
        x.fail = function(args) {
            return args;
        }
        return x;
    }
    return d;
}


var v;

var setVal = function() {
    var d = new Deferred();
    setTimeout(function() {
        v = 'a value';
        d.resolve(this);
    }, 5000);
    return d.promise();
};

setVal().done(function() {
    console.log('all done :' + v);
});
function Deferred(){
  this._done = [];
  this._fail = [];
}
Deferred.prototype = {
  execute: function(list, args){
    var i = list.length;

    // convert arguments to an array
    // so they can be sent to the
    // callbacks via the apply method
    args = Array.prototype.slice.call(args);

    while(i--) list[i].apply(null, args);
  },
  resolve: function(){
    this.execute(this._done, arguments);
  },
  reject: function(){
    this.execute(this._fail, arguments);
  }, 
  done: function(callback){
    this._done.push(callback);
  },
  fail: function(callback){
    this._fail.push(callback);
  }  
}


var v;

var setVal = function() {
    var d = new Deferred();
    setTimeout(function() {
        v = 'a value';
        d.resolve(this);
    }, 5000);
    return d;
};

setVal().done(function() {
    console.log('all done :' + v);
});