当前位置: 首页 > 面试题库 >

首选方式进行多个从属ajax同步调用

吕树
2023-03-14
问题内容

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

我的问题是:
1)相比使用另一种优势是什么?
2)在什么情况下一个人比​​另一个人更受青睐?
3)除了这2之外,还有其他更好的方法吗?

// jquery defer method

var defer = $.when(

    $.get('ajax_call_1');

);



defer.done(function () {

    $.get('ajax_call_2');

});







// callback on success

$(function(){

    $.ajax({

      url:'/ajax_call_1',

      data: {  },

      success: function(data){

        $.get('ajax_call_2');

      }

    });

  }

});

问题答案:

使用基于回调的承诺的一些原因:

  1. 排序多个异步操作要简单得多。
  2. 构建涉及多个异步操作的条件逻辑要简单得多。
  3. 进行涉及多个异步操作的可靠错误处理要容易得多。
  4. 构建可重用的异步接口要简单得多。
  5. 与其他异步接口的接口要简单得多。
  6. 处理异步代码中深处可能会导致静默失败的异常的处理要简单得多

在您的问题中,对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)相较之下,使用一个有什么优势?

您基本上是在问为什么对嵌套的回调使用promise。关于使用诺言的好处的文章有数百篇。我将看看是否可以找到一两个,但是Google搜索“为什么要对接回调”应该使您开始阅读。

JavaScript Promises有何优点?

异步编程保持精明

为什么我要转为承诺

2)在什么情况下一个人比​​另一个人更受青睐?

我不知道为什么使用普通嵌套回调比使用Promise更好。一旦学习了承诺,您几乎总会发现它们是更好的编码方式。我不使用Promise的唯一原因是,如果我试图使代码与没有Promise的旧浏览器兼容,即使那样,我可能仍会添加一个polyfill来支持Promise。

3)除了这2之外,还有其他更好的方法吗?

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

PS注意,我选择只.then()与jQuery Promise一起使用,因为这是ES6
Promise标准,并且当jQuery将其Promise转换为与标准更加兼容时,它将使将来变得更容易(它们正在努力)。与确实使用该标准的其他Promise源进行交互时,您的代码也将更加一致。

PPS承诺是一次性的设备。他们要么解决,要么拒绝一次。如果您试图从某个来源获取多个通知,则不会为此建立承诺。对于这种类型的问题,事件发射器或发布/订阅系统可能更合适。



 类似资料:
  • 问题内容: 在过去的几个小时中,我一直在努力解决这个问题,但无法解决。我想我仍然必须习惯于函数式编程风格;) 我写了一个递归函数,它遍历目录结构并对某些文件进行处理。此功能使用异步IO方法。现在,我要在完成整个遍历后执行一些操作。 如何确保在执行完所有调用但仍使用异步IO功能后执行此操作? 问题答案: 查找“ 步骤”模块。它可以链接异步函数调用,并将结果从一个传递到另一个。

  • 我调用了多个ajax调用,但代码只在所有ajax调用执行之后才到达API。 JavaScript: AppFactory API 链接工作很好,但我需要运行两个独立,我真的想知道发生了什么。 谢谢!!!

  • 我正在使用的应用程序将按以下顺序使用2个REST web服务: 1) 计数记录-了解特定时间范围内的记录数。 2)获取记录——一旦我们有了记录的数量,我们就需要调用这项服务。但是这项服务有一个门槛来一次性获取10K记录。假设第一个服务在特定的时间间隔内告诉我,它有100K的记录,那么我需要以分页方式调用第二个网络服务10次,考虑到它的阈值是一次10K的。 因此,如果我将进行10次同步调用,我的应用

  • 我正试图从同步方法运行异步方法。但是我不能等待异步方法,因为我在同步方法中。我一定不理解TPL,因为这是我第一次使用它。 每个方法都需要前一个方法来完成,因为第一个方法的数据用于第二个方法。 Await运算符只能在异步方法中使用。考虑用'async'修饰符标记此方法,并将其返回类型更改为'task' 但是,如果我使用async修饰符,这将是一个异步操作。因此,如果我对的调用没有使用await运算符

  • 问题内容: 如果一个同步方法调用另一个同步方法,那么线程安全吗? 问题答案: 是的,将方法标记为时,您实际上是在这样做: 当线程调用从method1进入method2时,它将确保它持有对的锁定,该锁定已经存在,然后可以通过。 当线程直接进入method1或method2时,它将阻塞直到获得锁(),然后进入。 正如詹姆斯·布莱克(James Black)在评论中指出的那样,您必须了解方法主体内部的操

  • 为什么下面的代码不能保证多个线程之间total_home数字的唯一性,即使逻辑处于同步块中。 } } } 这是一个程序示例。试着运行5-10次,你会发现total_home的值并不是每次都是唯一的。