3 回答
TA贡献1851条经验 获得超4个赞
这个答案使用promises
了ECMAScript 6
标准的JavaScript功能。如果您的目标平台不支持promises
,请使用PromiseJs对其进行填充。
在这里查看我的答案等到动画功能完成,直到运行另一个功能,如果你想使用jQuery
动画。
这里是你的代码将会是什么样ES6 Promises
和jQuery animations
。
Promise.resolve($('#art1').animate({ 'width': '1000px' }, 1000).promise()).then(function(){ return Promise.resolve($('#art2').animate({ 'width': '1000px' }, 1000).promise());}).then(function(){ return Promise.resolve($('#art3').animate({ 'width': '1000px' }, 1000).promise());});
普通方法也可以包含在内Promises
。
new Promise(function(fulfill, reject){ //do something for 5 seconds fulfill(result);}).then(function(result){ return new Promise(function(fulfill, reject){ //do something for 5 seconds fulfill(result); });}).then(function(result){ return new Promise(function(fulfill, reject){ //do something for 8 seconds fulfill(result); });}).then(function(result){ //do something with the result});
完成后then
立即执行该方法Promise
。通常,function
传递给的返回值then
作为结果传递给下一个。
但是如果Promise
返回a,则下一个then
函数将等待直到Promise
执行完并收到它的结果(传递给的值fulfill
)。
TA贡献1785条经验 获得超8个赞
听起来你并没有完全理解同步和异步函数执行之间的区别。
您在更新中提供的代码会立即执行每个回调函数,这些函数会立即启动动画。但是,动画是异步执行的。它的工作原理如下:
在动画中执行一个步骤
setTimeout
使用包含下一个动画步骤和延迟的函数调用一段时间过去了
setTimeout
执行的回调回到第1步
这将继续,直到动画的最后一步完成。与此同时,您的同步功能早已完成。换句话说,你的通话animate
功能并没有真正需要3秒钟。通过延迟和回调模拟效果。
你需要的是一个队列。在内部,jQuery的排队动画,只执行你一旦其对应的动画完成回调。如果你的回调然后开始另一个动画,效果是它们按顺序执行。
在最简单的情况下,这相当于以下内容:
window.setTimeout(function() { alert("!"); // set another timeout once the first completes window.setTimeout(function() { alert("!!"); }, 1000);}, 3000); // longer, but first
这是一个通用的异步循环函数。它将按顺序调用给定的函数,等待每个函数之间指定的秒数。
function loop() { var args = arguments; if (args.length <= 0) return; (function chain(i) { if (i >= args.length || typeof args[i] !== 'function') return; window.setTimeout(function() { args[i](); chain(i + 1); }, 2000); })(0);}
用法:
loop( function() { alert("sam"); }, function() { alert("sue"); });
显然,您可以修改此操作以获取可配置的等待时间,或立即执行第一个函数,或者在链false
中apply
的函数返回时或在指定上下文中的函数或您可能需要的任何其他函数时停止执行。
添加回答
举报