【发布时间】:2013-08-08 10:27:34
【问题描述】:
我想在不使用 jQuery 的情况下实现基本的 Deferred 对象。在这里,我将仅使用解决和拒绝功能实现完成和失败回调。并且当然将promise 方法与此函数相关联。
我正在纯 js 中执行以下实现(已编辑):
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);
});
但上面给出了错误:Object #<Object> has no method 'fail'
我知道Deferred() 函数的返回对象“d”没有方法 done()。如果我从Deferred() 返回 d.promise,这将没有解决和拒绝功能。
请指出我为实现延迟对象的简单目标而犯了什么错误。
这是我正在做的小提琴:http://jsfiddle.net/SyEmK/14/
【问题讨论】:
-
如果您使用
new创建实例,那么您应该将方法添加到prototype。构造函数返回一个实例,即使你return d。你可能想要var d = Deferred() -
您没有一个名为 done 的方法。如果你看你的对象,你有决心、拒绝和承诺。 setVal() 使用这 3 种方法返回对象的实例。
-
jQuery 并不是唯一实现承诺的库。
-
误把之前的 coed.. 请查看新编辑的代码..
-
@JayC 我想用纯js实现。 (只是作为一个约束,我必须遵循)..
标签: javascript jquery jquery-deferred deferred