【发布时间】:2016-04-02 16:21:16
【问题描述】:
假设我能够独立获取 ($.ajax)、处理 (process_*) 和保存 (store_* =) 数据 A 和 B 并且已经拥有 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_A 和 store_B 组合成一些东西:
var store_C;
function C() {
store_C = process_C(store_A, store_B);
}
假设A()、B() 和C() 是公共API,而所有其他东西都是内部的,实际上是复杂的代码(例如,我不能同时链接$.ajax)。
我想使用jQuery Deferred API 将上面的代码重构为新的 API,以便我可以请求任何情况:
case1: after(A).do(C)
case1: after(B).do(C)
case2: afterParallelJobsFinished(A, B).do(C)
并确保 store_A 或 store_B 按要求更新,store_C 仅在 A/B 之一或两者按要求更新后更新。
想象我们有 web 应用程序,用户可以在其中管理一组收入和支出。
在页面加载时,我们从不同的数据源(即$.ajax)并行获得收入和支出,渲染视图和存储数据(通常是混合在一起的process_* / store_* = ) 并显示total = SUM(incomes) - SUM(expenses)所有数据到达时。
那是case2。
当用户在case1 中编辑费用并请求部分页面更新时,因为我们只需要加载/渲染/存储扩展即可获得正确的total = SUM(incomes) - SUM(expenses)。
【问题讨论】:
-
你可以使用$.when,但是你需要在store_X中存储promise。
-
来自两个独立的
$.ajax()我得到了两个承诺。我怎样才能将它们结合起来?我想保留独立运行A()或B()或C()的能力。
标签: javascript jquery ajax promise jquery-deferred