Javascript jquery延迟回退-可能的作用域问题
我试图倾听一系列延迟完成的请求。我想添加后备方法,以便在初始url失败时,它将加载一个json文件。(我在这里加载了jsbin页面,以阻止任何跨域问题) 我最初的代码是这样的Javascript jquery延迟回退-可能的作用域问题,javascript,jquery,jquery-deferred,Javascript,Jquery,Jquery Deferred,我试图倾听一系列延迟完成的请求。我想添加后备方法,以便在初始url失败时,它将加载一个json文件。(我在这里加载了jsbin页面,以阻止任何跨域问题) 我最初的代码是这样的 function makeCalls() { var deferreds = []; var statsDeferred = $.get("http://thiswillfail.yesitwill"); statsDeferred.fail(
function makeCalls() {
var deferreds = [];
var statsDeferred =
$.get("http://thiswillfail.yesitwill");
statsDeferred.fail(function() {
$.get("http://run.jsbin.com/")
.done(function() {
statsDeferred.resolve();
});
deferreds.push(statsDeferred);
return deferreds;
}
var deferreds = makeCalls();
$.when.apply(null, deferreds).done(function() {
alert("done");
});
但是,它在statsdereferred.resolve()行失败代码>
我尝试添加$.proxy调用来维护作用域,但它不起作用
function makeCalls() {
var deferreds = [];
var statsDeferred =
$.get("http://thiswillfail.yesitwill");
statsDeferred.fail($.proxy(function() {
$.get("http://run.jsbin.com/")
.done($.proxy(function() {
statsDeferred.resolve();
}, this));
}, this));
deferreds.push(statsDeferred);
return deferreds;
}
var deferreds = makeCalls();
$.when.apply(null, deferreds).done(function() {
alert("done");
});
两者都失败了
statsDeferred.resolve();
未捕获类型错误:未定义不是函数
如果要连锁承诺,正确的方法是。然后()
:
您所犯的错误是延迟
和承诺
之间的差异
延迟
公开更改其内部状态的方法(.resolve
和.reject
)
承诺
仅允许您查看此状态并对其作出反应(.done
,失败
,…)
API函数通常会返回一个承诺
,这样外部用户就不能干预预期状态。例如,“修复”代码的一种方法如下:
function makeCalls() {
// make a deferred, you will be the one in control of its state :
var deferred = $.Deferred();
var firstGet = $.get("http://thiswillfail.yesitwill");
firstGet.done(function(response) { deferred.resolve(response); })
// if the first request fails, run the second :
firstGet.fail(function(){
var secondGet = $.get("http://run.jsbin.com/");
secondGet.done(function(response) { deferred.resolve(response) };
secondGet.fail(function() { deferred.reject() });
});
// only return the Promise to the outer world :
return deferred.promise();
}
statsDeferred.resolve();
Uncaught TypeError: undefined is not a function
function makeCalls() {
// make a deferred, you will be the one in control of its state :
var deferred = $.Deferred();
var firstGet = $.get("http://thiswillfail.yesitwill");
firstGet.done(function(response) { deferred.resolve(response); })
// if the first request fails, run the second :
firstGet.fail(function(){
var secondGet = $.get("http://run.jsbin.com/");
secondGet.done(function(response) { deferred.resolve(response) };
secondGet.fail(function() { deferred.reject() });
});
// only return the Promise to the outer world :
return deferred.promise();
}