0

请参考我们项目中的以下调用函数。

  var obj; // this will modified in A() function
function c()
{
   A();
   B(obj);
}

function A()
{

   for(i=0;i < object.length; i++)
   {
     if(object.data.toString()=="remote data")
       processRemoteData();
     else
       processData();
    }

}

function  processRemoteData()
{
   $.ajax({
      url://remote url
      success:function(data)
      {
         // set this remote data in some object that will be passed in b function
      }
   });
}


function processData()
{
   //process data
}

我将在 B() 函数中传递 obj(对象),它将在 A() 函数中修改或在 A() 函数中设置。但 A() 函数注意返回。

我想等待 A() 函数获取远程数据或普通数据,直到 B() 函数永远不会启动。因为基于 A() 函数中修改的对象,我将在 B() 函数中进行处理。

但在我的场景中,A() 函数永远不会等到它从远程 URL 获取数据,它会立即启动 B() 函数。

我试过这样

$.when(A()).done(function()
{
  B();
});

这也不起作用,然后我接近 $.deferred 这意味着

function A()
{
   var def= $.deferred();
   //process

   return def.promise();
}

但是这种方法对我来说也不能正常工作,因为 A() 函数永远不会等到它完成回调函数然后启动 B()

谢谢,

湿婆

4

2 回答 2

1

尝试类似的东西

function A() {
    var def = $.deferred();

    var collect = [];

    for (i = 0; i < object.length; i++) {
        if (object.data.toString() == "remote data")
            collect.push(processRemoteData());
        else
            collect.push(processData());
    }

    $.when(collect).then(function() {
        def.resolve();
    }, function() {
        def.reject();
    })

    return def.promise();
}
function processRemoteData() {
    return $.ajax({
        url : '',
        success : function(data) {
            // set this remote data in some object that will be passed
            // in b function
        }
    });
}

function processData() {
    var def = $.deferred();
    // process data
    def.resolve();
    return def.promise();
}
于 2013-05-10T11:24:37.793 回答
-1

您可以在 $.ajax 中添加“async: false”选项。将 async 设置为 false 告诉 jquery 使用同步 ajax 查询(默认情况下,使用异步 ajax 查询)

于 2013-05-10T11:28:15.677 回答