Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jquery延迟回退-可能的作用域问题_Javascript_Jquery_Jquery Deferred - Fatal编程技术网

Javascript jquery延迟回退-可能的作用域问题

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(

我试图倾听一系列延迟完成的请求。我想添加后备方法,以便在初始url失败时,它将加载一个json文件。(我在这里加载了jsbin页面,以阻止任何跨域问题)

我最初的代码是这样的

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();
}