我有一种情况,我在使用jquery进行大量的AJAX调用,然后将这些调用中的JSON数据返回到页面上的某些变量中。 问题是Ajax调用需要一点时间来处理,同时我的控制转移到下一个语句,我打算使用AJAX调用的输出。 由于调用需要时间来返回数据,因此我留下的空对象使我的功能失效。 有没有什么方法可以等待AJAX调用的结束发生,只有当从调用返回结果时才继续???
所以这是我的代码,我试图将transactionsAtError返回到其他jquery文件,其中控件在执行此调用之前转移到下一个语句
this.GetTransactionAtErrors = function (callback) {
var transactionsAtError;
$.ajax({
url: ('/Management/GetTransactionsAtError'),
type: 'POST',
cache: false,
success: function (result) {
if (result && callback) {
transactionsAtError = (typeof (result) == "object") ? result : $.parseJSON(result);
}
}
});
return transactionsAtError;
}
答案 0 :(得分:2)
假设您正在使用jQuery的$.getJSON()函数,您可以提供一个回调函数,该函数将在从服务器返回数据后执行。
示例:
$.getJSON("http://example.com/get_json/url", function(data){
console.log("the json data is:",data);
});
修改强>:
看到你添加的代码后,我可以看到你的问题。
你的return transactionsAtError;
行独立于ajax调用运行,即它将在ajax完成之前运行。
你应该在成功中调用你的回调函数。
示例:
this.GetTransactionAtErrors = function (callback) {
$.ajax({
url: ('/Management/GetTransactionsAtError'),
type: 'POST',
cache: false,
success: function (result) {
if (result && callback) {
var transactionsAtError = (typeof (result) == "object") ? result : $.parseJSON(result);
callback(transactionsAtError);
}
}
});
}
答案 1 :(得分:0)
如果你的结果在范围内,你可以通过使用es6承诺检查等待ajax调用完成:
function ajaxwait()
{
return(new Promise(function(resolve, reject) {
var i = setInterval(function() {
if(jQuery.active == 0) {
resolve();
clearInterval(i);
}
}, 100);
}));
}
你可以使用它。
ajaxwait().then(function(){ /* Code gets executed if there are no more ajax calls in progress */ });
使用像https://github.com/jakearchibald/es6-promise这样的es6垫片,使其在旧浏览器中运行。