【发布时间】:2015-02-16 06:53:11
【问题描述】:
我不太了解 jQuery 的魔术 deferred 对象。假设如下代码:
function callWebService(uri, filter, callback)
{
var data = {};
if (filter && filter != '')
data['$filter'] = filter;
jQuery.ajax({
url: '/_api/lists/' + uri + '/items',
data: data,
success: callback,
dataType: 'json'
});
}
function getInitialData() {
callWebService("InitialData", "", function (data) {
//do stuff with data
});
}
function getGreenData() {
callWebService("GreenData", "filter from InitialData", function (data) {
//do stuff with data
});
}
function getRedData() {
callWebService("RedData", "filter from InitialData", function (data) {
//do stuff with data
});
}
function getFinalData() {
callWebService("FinalData", "filter from RedData & GreenData", function (data) {
//do stuff with data
});
}
我想做的事情的顺序是这样的——最后我会调用四个 web 服务,而这些调用相互依赖(一个长链):
- 致电
getInitialData - 调用
getGreenData依赖于getInitialData - 调用
getRedData依赖getInitialData - 调用
getFinalData依赖于getGreenData和getRedData
如您所知,2 和 3 可能同时发生。我想我可以使用jQuery.when()(或resolve?),我只是不知道如何在这里应用它。我想我需要重新编写函数以始终返回 ajax 对象?
伪代码如下所示:
getInitialData().then(getGreenData, getRedData).then(getFinalData)
【问题讨论】:
-
不要以大写字母开头函数名,这会使 Stack Overflows 语法高亮中的颜色看起来很奇怪!
-
如果你
returnCallWebService 中的 ajax 方法,你应该可以访问.then承诺 -
固定函数名,直接来自我的 C# 环境;-)
-
您想要并行调用还是顺序调用,因为这种细微差别会改变我下面的示例?在我的答案中添加了一个平行的例子。对任何错别字表示歉意。 :)
-
Parallel & Sequential ;-) 由于你的回答,我最好的猜测是这样的:
getInitialData.when(getGreenData, getRedData).then(getFinalData).done(function())- 我只需要弄清楚传递给每个承诺的内容,所以我可以在 @ 987654337@电话。
标签: javascript jquery ajax jquery-deferred chaining