请参阅我们项目中的以下调用函数。
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(object),该函数将在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()
谢谢,
希瓦
答案 0 :(得分: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();
}
答案 1 :(得分:-1)
您可以在$ .ajax中添加“async:false”选项。将async设置为false会告诉jquery使用同步ajax查询(默认情况下,使用异步ajax查询)