jQuery 推迟;等待函数的回调
jQuery deferrend; callback for waiting functions
我必须用 AJAX 请求调用 3 个函数,然后才能完成其中一个函数。所有函数都需要相同的数据,所以我只想启动一次 AJAX 请求。我认为我需要一个功能来调用 3 个函数中的 2 个来等待并在最后提供数据。也许问题是我是 jQuery Deferred 的新手,没有找到一些基本的东西?感谢您的帮助!
因为我的脚本太复杂了,所以我创建了这个演示:(我希望它是不言自明的)
<script>
var requestRunning = false;
//do some ajax request etc...
function doSomething() {
return {
doIt: function (test, startDelay) {
var dfd = $.Deferred();
setTimeout(function () {
if (requestRunning == false) {
console.log("starting ajax call:", test);
requestRunning = true;
//Fake ajax call
setTimeout(function () {
dfd.resolve(test);
// Todo: A done; provide data to waiting B and C.
}, 500);
}
else {
console.log("ajax call allready running, waiting...", test);
}
}, startDelay);
return dfd.promise();
}
}
}
// Fake delay for function calls in really short time
var master = doSomething();
var a = master.doIt("a", 10);
var b = master.doIt("b", 15);
var c = master.doIt("c", 12);
// Do some stuff with the received data...
a.done(function myfunction(result) {
console.log(result + " done");
});
b.done(function myfunction(result) {
console.log(result + " done");
});
c.done(function myfunction(result) {
console.log(result + " done");
});
</script>
我不完全确定你想做什么,但如果你想做的是一次启动三个 ajax 调用,然后知道它们何时完成,因为 jQuery ajax 已经调用了 return 一个承诺,您可以像这样使用该承诺和 $.when()
:
var p1 = $.ajax(...);
var p2 = $.ajax(...);
var p3 = $.ajax(...);
$.when(p1, p2, p3).then(function(r1, r2, r3) {
// results of the three ajax calls in r1[0], r2[0] and r3[0]
});
或者,你甚至可以不使用中间变量:
$.when(
$.ajax(...),
$.ajax(...),
$.ajax(...)
).then(function(r1, r2, r3) {
// results of the three ajax calls in r1[0], r2[0] and r3[0]
});
如果您正在调用自己执行 ajax 调用的函数,那么您可以 return 这些函数的 ajax promise 并使用具有上述结构的函数调用:
function doSomethingAjax() {
// some code
return $.ajax(...).then(...);
}
$.when(
doSomethingAjax1(...),
doSomethingAjax2(...),
doSomethingAjax3(...)
).then(function(r1, r2, r3) {
// results of the three ajax calls in r1[0], r2[0] and r3[0]
});
我必须用 AJAX 请求调用 3 个函数,然后才能完成其中一个函数。所有函数都需要相同的数据,所以我只想启动一次 AJAX 请求。我认为我需要一个功能来调用 3 个函数中的 2 个来等待并在最后提供数据。也许问题是我是 jQuery Deferred 的新手,没有找到一些基本的东西?感谢您的帮助!
因为我的脚本太复杂了,所以我创建了这个演示:(我希望它是不言自明的)
<script>
var requestRunning = false;
//do some ajax request etc...
function doSomething() {
return {
doIt: function (test, startDelay) {
var dfd = $.Deferred();
setTimeout(function () {
if (requestRunning == false) {
console.log("starting ajax call:", test);
requestRunning = true;
//Fake ajax call
setTimeout(function () {
dfd.resolve(test);
// Todo: A done; provide data to waiting B and C.
}, 500);
}
else {
console.log("ajax call allready running, waiting...", test);
}
}, startDelay);
return dfd.promise();
}
}
}
// Fake delay for function calls in really short time
var master = doSomething();
var a = master.doIt("a", 10);
var b = master.doIt("b", 15);
var c = master.doIt("c", 12);
// Do some stuff with the received data...
a.done(function myfunction(result) {
console.log(result + " done");
});
b.done(function myfunction(result) {
console.log(result + " done");
});
c.done(function myfunction(result) {
console.log(result + " done");
});
</script>
我不完全确定你想做什么,但如果你想做的是一次启动三个 ajax 调用,然后知道它们何时完成,因为 jQuery ajax 已经调用了 return 一个承诺,您可以像这样使用该承诺和 $.when()
:
var p1 = $.ajax(...);
var p2 = $.ajax(...);
var p3 = $.ajax(...);
$.when(p1, p2, p3).then(function(r1, r2, r3) {
// results of the three ajax calls in r1[0], r2[0] and r3[0]
});
或者,你甚至可以不使用中间变量:
$.when(
$.ajax(...),
$.ajax(...),
$.ajax(...)
).then(function(r1, r2, r3) {
// results of the three ajax calls in r1[0], r2[0] and r3[0]
});
如果您正在调用自己执行 ajax 调用的函数,那么您可以 return 这些函数的 ajax promise 并使用具有上述结构的函数调用:
function doSomethingAjax() {
// some code
return $.ajax(...).then(...);
}
$.when(
doSomethingAjax1(...),
doSomethingAjax2(...),
doSomethingAjax3(...)
).then(function(r1, r2, r3) {
// results of the three ajax calls in r1[0], r2[0] and r3[0]
});