javascript – jQuery ajax调用链接多个依赖项

我不太了解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
  });
}

我想做的事情是这样的 – 最后我将调用四个webservices,而调用依赖于彼此(一个长链):

>调用getinitialData
>调用与getinitialData相关的getGreenData
>调用与getinitialData相关的getRedData
>调用getFinalData依赖于getGreenData和getRedData

你可以告诉2& 3可以同时发生.我想我可以使用jQuery.when()(或解决?),我只是不知道如何在这里应用它.我想我需要重做函数来始终返回ajax对象?

Pseude-code看起来像这样:

getinitialData().then(getGreenData, getRedData).then(getFinalData)

解决方法:

$.ajax返回一个jQuery承诺.然后,您可以调用该承诺将链完成链接函数. ajax数据作为promise参数传递给任何最终的回调函数.那是因为$.ajax“承诺返回Ajax数据”.

如果您对所有功能使用相同的模式,则可以根据需要链接所有功能.通过不调用函数添加匿名回调,它只是使用每个函数调用产生的promises并将它们组合在一起.

就像是:

function CallWebService (uri, filter)
{
  var data = {};

  if (filter && filter != '')
    data['$filter'] = filter;

  return jQuery.ajax({
    url: '/_api/lists/' + uri + '/items',
    data: data,
    dataType: 'json'
  });
}

function getGreenData() {
  return CallWebService("GreenData", "filter from InitialData");
}

function getRedData() {
  return CallWebService("RedData", "filter from InitialData");
}

function GetinitialData() {
    return CallWebService("InitialData", "").then(GetGreenData);
}

// Fetch green data then red data sequentially
function GetFinalData () {
    return getGreenData().then(getRedData);
}

// Call the final one
GetFinalData().done(function(greendata, reddata){
     Alert("all done!");
});

要并行运行promises,请立即评估函数,并将结果承诺与$.when结合使用:

例如

// Fetch green data and red data in parallel
function GetFinalData () {
    return $.when(getGreenData(), getRedData());
}

相关文章

IE6是一个非常老旧的网页浏览器,虽然现在很少人再使用它,但...
PHP中的count()函数是用来计算数组或容器中元素的个数。这个...
使用 AJAX(Asynchronous JavaScript and XML)技术可以在不...
Ajax(Asynchronous JavaScript and XML)是一种用于改进网页...
本文将介绍如何通过AJAX下载Excel文件流。通过AJAX,我们可以...
Ajax是一种用于客户端和服务器之间的异步通信技术。通过Ajax...