我在正常( 非ajax )函数中遇到了问题,每个函数中都包含许多 动画
。目前,我只是具有一个setTimeout
between函数,但这并不是完美的,因为没有浏览器/计算机是相同的。
附加说明:它们都有碰撞的单独动画/等。
我不能简单地将一个放在另一个的回调函数中
// multiple dom animations / etc
FunctionOne();
// What I -was- doing to wait till running the next function filled
// with animations, etc
setTimeout(function () {
FunctionTwo(); // other dom animations (some triggering on previous ones)
}, 1000);
无论如何在js / jQuery中有:
// Pseudo-code
-do FunctionOne()
-when finished :: run -> FunctionTwo()
我知道$.when()
&$.done()
,但是这些是针对AJAX的…
jQuery有一个名为$ .timers的暴露变量(由于某种原因未在jQuery文档中列出),该变量保存当前发生的动画数组。
function animationsTest (callback) {
// Test if ANY/ALL page animations are currently active
var testAnimationInterval = setInterval(function () {
if (! $.timers.length) { // any page animations finished
clearInterval(testAnimationInterval);
callback();
}
}, 25);
};
基本用法:
// run some function with animations etc
functionWithAnimations();
animationsTest(function () { // <-- this will run once all the above animations are finished
// your callback (things to do after all animations are done)
runNextAnimations();
});
您可以使用jQuery的 $.Deferred
var FunctionOne = function () {
// create a deferred object
var r = $.Deferred();
// do whatever you want (e.g. ajax/animations other asyc tasks)
setTimeout(function () {
// and call `resolve` on the deferred object, once you're done
r.resolve();
}, 2500);
// return the deferred object
return r;
};
// define FunctionTwo as needed
var FunctionTwo = function () {
console.log('FunctionTwo');
};
// call FunctionOne and use the `done` method
// with `FunctionTwo` as it's parameter
FunctionOne().done(FunctionTwo);
您还可以将多个延期打包在一起:
var FunctionOne = function () {
var
a = $.Deferred(),
b = $.Deferred();
// some fake asyc task
setTimeout(function () {
console.log('a done');
a.resolve();
}, Math.random() * 4000);
// some other fake asyc task
setTimeout(function () {
console.log('b done');
b.resolve();
}, Math.random() * 4000);
return $.Deferred(function (def) {
$.when(a, b).done(function () {
def.resolve();
});
});
};
问题内容: 我想在pullData()完成后运行loadViews(),但我想知道这样做的最佳方法是什么?我也想在其上设置10秒超时,以便在可能的情况下显示网络错误。根据我的阅读,GCD看起来是完成此任务的方法,但是我对它的实现感到困惑。谢谢你提供的所有帮助! 问题答案: 您需要的是带有完成块的完成处理程序。 创建它非常简单: 并使用您的完成块,如下所示:
问题内容: 我有一个带有主标签页活动的Android应用程序,并且在单个标签页内有多个活动。在我的主要活动的onCreate()中,我有一个可运行的内容,它创建了一个列表,而在各个活动中,我都使用了此列表。 在各个活动的onCreate()中,我还具有在列表上运行的Runnable。但是,我需要这些Runnable仅在主选项卡活动的Runnable完成创建列表时才运行,否则我将得到一个空列表。我正
问题内容: 我有以下 我有一个运行一些ajax的函数,然后根据ajax是否成功返回true或false。我从代码的多个位置调用了这个ajax函数。 因为该函数在ajax完成之前结束,所以它总是返回false。如何避免这种情况? 我读到一些建议我在函数中执行的操作,然后将和函数移至我的和函数。但是,在我的方法中,我进行了大量的计算。很多代码。因此,问题在于,如果我将功能移至其他功能,那么我将复制一堆
问题内容: 我有以下JavaScript代码: 我如何确保仅在完成后调用? 问题答案: 指定一个匿名回调,并使function1接受它:
我使用的是Firebase Cloud Firestore,然而,我认为这可能更像是JavaScript异步与同步promise返回的问题。 我正在执行一个查询以从一个集合中获取ID,然后循环该查询的结果以根据该ID从另一个集合中查找单个记录。 我怎么能等到forEach完成后才从外部promise和外部函数本身返回呢?
问题内容: 如何让我的代码等待,直到DispatchQueue中的任务完成?是否需要任何CompletionHandler或其他东西? 我正在使用Xcode 8.2并在Swift 3中编写。 问题答案: 使用s可以实现这一点。您可以在群组和通话达到平衡时得到通知: 或者您可以等待: 注意 :阻止当前队列(在您的情况下可能是主队列),因此您必须在另一个队列上(如上面的示例代码中)以避免 死锁 。