举例来说,我有两个函数,里面有随机代码,而且基于用户的系统(慢速、中速或快速),无法判断这两个函数需要多长时间才能完成,所以使用setTimeout
尝试开火时不实用function2
仅之后 function1
完成了。
如何使用 jQuery.deferred
制作function2
仅在 function1
之后开火不管时间要求是什么,考虑到这两个函数都是 100% 非 jQuery 函数,内部没有 jQuery 代码,因此完全无法被 jQuery 观察到?最多,这些函数可能包括 jQuery 方法,如 .css()
。它没有时间关联,在旧计算机上运行速度较慢。
我如何保证 function2
未与 function1
同时执行如果我这样称呼他们:
function1(); function2();
使用 $.deferred
?除了关于 $.deferred
的答案之外的任何其他答案也欢迎!
3 月 20 日添加: 如果 function1() 是一个 lambda 函数,根据用户输入,该函数可能有也可能没有异步调用,并且无法判断该函数将执行多少操作怎么办?它是一个您对接下来会发生什么一无所知的函数,但无论如何,您仍然希望 function2 仅在之后执行来自 lambda 函数的所有内容(function1 ) 完成,无论需要多长时间,只要异步方面完成即可。如何实现?
3 月 22 日添加: 所以我想做我要求的唯一方法是将匿名函数作为回调传递给异步函数,异步函数在回调完成后执行回调,或者创建事件监听器,在事件最终触发时执行你想要的.
实际上没有任何方法可以只在两条单独的线路上执行异步调用并让它们按顺序触发,而无需在包含所述函数的框架内手动构建机制(事件处理程序)来处理它们的实际执行。
这类机制的一个很好的例子是 jQuery 的 .queue()
。方法和$.Defferred
对象。
下面的答案以及在 .queue()
上阅读 jQuery 的 API正在使用 $.Deferred
有助于澄清这一点。
Tgr 在下面给出了一个很好的例子,说明如何使用 jQuery 的 $.Deferred
创建自定义可链接函数。对象,并且自定义函数本身不一定必须在其中包含任何 jQuery 代码,这正是我一直在寻找的。p>
最佳答案
function first(deferred) {
// do stuff
deferred.resolve();
}
function second() {
// do stuff
}
$.Deferred(first).then(second);
但正如 Tomalak 指出的那样,这是不必要的,除非您在 first
中做了一些非常棘手的事情(比如利用网络 worker )。
更新:
基本思想是,每当你做一些不是即时的事情时,你都会创建一个 Deferred 对象,并返回它。 (jQuery 的 AJAX 调用已经这样做了。)然后您可以使用 Deferred.then 来延迟后续操作。
function first() {
var deferred = $.Deferred();
var callback = function() {
deferred.resolve();
}
// do immediate stuff
someAsyncOperation(callback);
return deferred.promise(); // turns the Deferred into a Promise, which
// means that resolve() will not be accessible
}
function second() {
// do stuff
}
first().then(second); // or: $.when(first).then(second)
如果second
也是一个异步操作,你可以使用$.when
的合并能力:
function second() {
var anotherDeferred = $.Deferred();
// do stuff with anotherDeferred
return anotherDeferred.promise();
}
$.when(first(), second()).then(third); // third will run at the moment when
// both first and second are done
关于javascript - 如何将 $.deferred 与不可观察的函数一起正确使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5361124/