Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/88.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 首选执行多个相关ajax同步调用的方法_Javascript_Jquery_Ajax_Asynchronous - Fatal编程技术网

Javascript 首选执行多个相关ajax同步调用的方法

Javascript 首选执行多个相关ajax同步调用的方法,javascript,jquery,ajax,asynchronous,Javascript,Jquery,Ajax,Asynchronous,我已经看到了执行多个相关ajax同步调用的不同方法。其中两种被广泛采用的方法是jquery延迟方法和成功回调 我的问题是: 1) 使用一个比另一个有什么好处 2) 在什么情况下,一个优先于另一个 3) 除了这两种方法,还有其他更好的方法吗 //jquery延迟方法 变量延迟=$。当( $.get('ajax_call_1'); ); defer.done(函数(){ $.get('ajax_call_2'); }); //成功回访 $(函数(){ $.ajax({ url:“/ajax\u c

我已经看到了执行多个相关ajax同步调用的不同方法。其中两种被广泛采用的方法是jquery延迟方法和成功回调

我的问题是:
1) 使用一个比另一个有什么好处
2) 在什么情况下,一个优先于另一个
3) 除了这两种方法,还有其他更好的方法吗

//jquery延迟方法
变量延迟=$。当(
$.get('ajax_call_1');
);
defer.done(函数(){
$.get('ajax_call_2');
});
//成功回访
$(函数(){
$.ajax({
url:“/ajax\u call\u 1”,
数据:{},
成功:函数(数据){
$.get('ajax_call_2');
}
});
}

});使用承诺而不是回调的一些原因:

  • 对多个异步操作进行排序要简单得多
  • 构建包含多个异步操作的条件逻辑要简单得多
  • 执行涉及多个异步操作的健壮错误处理要简单得多
  • 构建可重用异步接口要简单得多
  • 与其他异步接口的接口要简单得多
  • 处理异步代码深处可能发生的异常要简单得多,否则会导致静默故障
  • 在您的问题中,对jQuery Ajax调用进行排序并捕获所有可能的错误的最简单方法是使用从
    $.Ajax()
    返回的自然承诺并将它们链接起来:

    $.get('ajax_call_1').then(function(value) {
        return $.get('ajax_call_2');
    }).then(function(result) {
        // success with both here
    }, function(err) {
        // error with one of them here
    });
    
    或者,没有像您的示例中那样的错误处理:

    $.get('ajax_call_1').then(function(value) {
        $.get('ajax_call_2');
    })
    
    没有理由在此处使用此构造:

    // jquery defer method
    var defer = $.when(
        $.get('ajax_call_1');
    );
    
    因为
    $.get()
    已经返回了一个承诺,所以不需要使用
    $.when()
    来创建另一个承诺<代码>$.when()
    在您有多个承诺并且希望知道所有承诺何时完成时非常有用。对于一个承诺,您只需直接使用它—没有理由使用带有单个承诺的
    $.when()


    你可以用第二种方法:

    // callback on success
        $.ajax({
          url:'/ajax_call_1',
          data: {  },
          success: function(data){      
            $.get('ajax_call_2');
          }
        });
    
    因为这只是使用嵌套回调进行编码的非承诺方式。主要的缺点是,当不使用承诺时,错误的传播和对多个操作的排序变得混乱和困难。在这个简单的示例中,尝试从任何一个ajax调用返回给调用方的错误。要做到这一点需要很多额外的代码。我上面的promise示例将所有错误传播回调用方


    关于你的具体问题:

    1) 使用一个比另一个有什么好处

    您基本上是在问为什么在嵌套回调中使用承诺。关于使用承诺的好处有数百篇文章。我会看看是否能找到一两个,但谷歌搜索“为什么承诺vs.回调”会让你开始阅读

    2) 在什么情况下,一个优先于另一个

    我不知道为什么普通嵌套回调比使用承诺更受欢迎。一旦你学会了承诺,你就会发现它们是一种更好的编码方式。我不使用Promissions的唯一原因是,如果我试图使代码与没有Promissions的旧浏览器兼容,即使在那时,我也可能只包含一个polyfill,以便支持Promissions

    3) 除了这两种方法,还有其他更好的方法吗

    是的,请参见我的第一个代码示例


    注意,我选择只将
    .then()
    与jQuery承诺一起使用,因为这是ES6承诺标准,将来当jQuery将其承诺转换为更兼容的标准(他们正在研究)时,这将更容易实现。当与使用该标准的其他承诺源接口时,您的代码也将更加一致


    p.p.S.承诺是一次性的手段。他们要么决定要么拒绝一次,而且只有一次。如果您试图从某个来源获取多个通知,那么承诺就不是为此而构建的。事件发射器或发布/订阅系统可能更适合此类问题。

    使用承诺而不是回调的一些原因:

  • 对多个异步操作进行排序要简单得多
  • 构建包含多个异步操作的条件逻辑要简单得多
  • 执行涉及多个异步操作的健壮错误处理要简单得多
  • 构建可重用异步接口要简单得多
  • 与其他异步接口的接口要简单得多
  • 处理异步代码深处可能发生的异常要简单得多,否则会导致静默故障
  • 在您的问题中,对jQuery Ajax调用进行排序并捕获所有可能的错误的最简单方法是使用从
    $.Ajax()
    返回的自然承诺并将它们链接起来:

    $.get('ajax_call_1').then(function(value) {
        return $.get('ajax_call_2');
    }).then(function(result) {
        // success with both here
    }, function(err) {
        // error with one of them here
    });
    
    或者,没有像您的示例中那样的错误处理:

    $.get('ajax_call_1').then(function(value) {
        $.get('ajax_call_2');
    })
    
    没有理由在此处使用此构造:

    // jquery defer method
    var defer = $.when(
        $.get('ajax_call_1');
    );
    
    因为
    $.get()
    已经返回了一个承诺,所以不需要使用
    $.when()
    来创建另一个承诺<代码>$.when()在您有多个承诺并且希望知道所有承诺何时完成时非常有用。对于一个承诺,您只需直接使用它—没有理由使用带有单个承诺的
    $.when()


    你可以用第二种方法:

    // callback on success
        $.ajax({
          url:'/ajax_call_1',
          data: {  },
          success: function(data){      
            $.get('ajax_call_2');
          }
        });
    
    因为这只是使用嵌套回调进行编码的非承诺方式。主要的缺点是,当不使用承诺时,错误的传播和对多个操作的排序变得混乱和困难。在这个简单的示例中,尝试从任何一个ajax调用返回给调用方的错误。要做到这一点需要很多额外的代码。我上面的promise示例将所有错误传播回调用方


    关于你的具体问题:

    1) 使用一个比另一个有什么好处

    你基本上是在问为什么要使用承诺