有没有办法在另一个函数完成后运行一个函数?例如:
doSomething();
doSomethingElse();
我只希望 doSomethingElse() 在 doSomething 完成后运行。这可能吗?
有没有办法在另一个函数完成后运行一个函数?例如:
doSomething();
doSomethingElse();
我只希望 doSomethingElse() 在 doSomething 完成后运行。这可能吗?
如果您的doSomething()
函数正在异步执行某些操作(例如发出 Ajax 请求),那么您将希望doSomethingElse()
为该异步请求进行回调,而不是让它在doSomething()
返回后立即执行。
实际上你可以用 jQuery 做你想做的事(至少在某种意义上)。它可能被认为有点hacky,但完美无瑕。
只需在您的页面中包含一个您不用于其他任何内容的元素。例如某处的空 div。
<div id="syncFnHolder"></div>
然后将 JS 包含在您的函数中 +runMe
我编写的函数中。
function doSomething() { alert("First"); }
function doSomethingElse() { alert("Second"); }
function doSomethingElseThree() { alert("Third"); }
function runMe(fn, selec) {
return function() {
fn();
setTimeout(function() {
$(selec).dequeue("syncFnQueue");
}, 1000);
}
};
var selector = "#syncFnHolder";
//add three functions to a queue
$(selector).queue("syncFnQueue", runMe(doSomething, selector));
$(selector).queue("syncFnQueue", runMe(doSomethingElse, selector));
$(selector).queue("syncFnQueue", runMe(doSomethingElseThree, selector));
//start first function in queue (FIFO) others are triggered automatically
$(selector).dequeue("syncFnQueue");
这将生成三个警报,它们之间的距离为 1 秒,分别表示“第一”、“第二”、“第三”。
如果您不想延迟,请删除 setTimeout 并将呼叫留给$(selec).dequeue("syncFnQueue");
.
如果您的函数需要参数,例如doSomething(x,y,z)
,您需要将runMe
函数调整为更好的局部函数并以不同的方式构造返回的函数。在此处检查或发布新问题。
你可能想这样做....
function doSomething(callback) {
// code for do some thing
// now fire off the callback
if (typeof callback === 'function') {
callback();
}
}
function doSomethingElse() {
}
doSomething(doSomethingElse);
本身没有办法明确地强制执行这一点,但一个想法是让 doSomething() 返回一个 doSomethingElse() 接受作为参数的值:
retval = doSomething();
doSomethingElse(retval);
这样至少你可以防止某人在没有提供它需要的参数的情况下调用 doSomethingElse() ......当然,他们是否从调用 doSomething() 中获得该参数是另一个问题。但这是一个开始。
从 Code Complete 提出的想法。