javascript - API设计: How can I combine result of two deferred jQuery objects?

标签 javascript jquery ajax promise jquery-deferred

假设我能够获取($.ajax)、处理(process_*)并保存(store_* =)数据AB独立且已经有API:

var store_A;
function A() {
  $.ajax({url: "/getA"}).done(function(data) {
     store_A = process_A(data);
}); }

var store_B;
function B() {
  $.ajax({url: "/getB"}).done(function(data) {
     store_B = process_B(data);
}); }

我有一个函数 C()能够结合store_Astore_B变成一些东西:

var store_C;
function C() {
   store_C = process_C(store_A, store_B);
}

假设A() , B()C()是公共(public) API,所有其他东西都是内部结构,实际上是复杂的代码(因此,例如,我不能将 $.ajax 直接链接起来)。

我想使用 jQuery Deferred API 将上述代码重构为新的 API所以我可以要求任何情况:

case1: after(A).do(C)
case1: after(B).do(C)
case2: afterParallelJobsFinished(A, B).do(C)

并确保 store_Astore_B根据要求更新和store_C仅在根据需要更新一个或两个 A/B 后更新。


假设我们有 web 应用程序,用户可以在其中管理一组收入和支出。

在页面加载时,我们从不同的数据源(即 $.ajax)并行获取收入和支出,呈现 View 和存储数据(通常是混合的 process_*/store_* = ) 并显示 total = SUM(incomes) - SUM(expenses) 当所有数据到达时

case2 .

当用户编辑费用并请求部分页面更新时,我们在 case1因为我们只需要加载/渲染/存储 expanses 就可以得到正确的 total = SUM(incomes) - SUM(expenses) .

最佳答案

$.when() 可以接受任意数量的延迟对象。 It can even take a dynamic number如果您不知道要打多少个电话。

$.when(callA(), callB()).done(function() {
 // Do stuff here when both calls are done
});

function callA() {
  return $.ajax({
    url: ...,
    success: function() {
      // Do stuff here when callA is done
    }
  });
}

function callB() {
  return $.ajax({
    url: ...,
    success: function() {
      // Do stuff here when callB is done
    }
  });
}

关于javascript - API设计: How can I combine result of two deferred jQuery objects?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34499935/

相关文章:

javascript - Ajax 请求在第二次尝试时不起作用

javascript - FineUploader 构造函数失败

Javascript。未捕获的类型错误 : Hashids is not a constructor

javascript - javascript中如何将变量从一个函数传递到另一个函数

javascript - 如何在 Django 中为表单设置 ID?

javascript - Ajax 函数使用响应中的一些参数重新加载页面

javascript - 在 TypeScript 中使用 JavaScript 类

jquery - 想要这个动画回到以前的位置

javascript - 更改 PartialView 中 <p> 的值

javascript - 无法将 Dropzone 附加到 AJAX 加载的 DIV