在调用下一个函数之前等待函数完成的最佳方法是什么?
我有一个场景,连续调用两个函数,一个接一个地调用。我需要在调用第二个之前完成第一个。
Function1();
Function2();
如何在尝试Function1
之前告诉代码等待Function2
完成?
WebDevelopment:解决方案可以是javascript或jQuery,也可以是基于Ajax的。
谢谢...
答案 0 :(得分:1)
您可以采用多种方式,但这是一个非常简单的示例
function first(){
// define every thing here and then at the end call your second function
function2();
}
查看更多可能性here
答案 1 :(得分:0)
如果您在浏览器中使用回调,那么这是最简单的跨浏览器方式。
例:
function sayBill() {
console.log('bill');
}
function sayHiAfterTwoSeconds(callback) {
setTimeout(function() {
console.log('hi');
// call the function you passed in parameter
if (typeof callback === 'function') {
callback();
}
});
}
sayHiAfterTwoSeconds(sayBill);
// will output 'bill hi'
https://jsfiddle.net/80bbbjco/
如果您想要更好的方法,但不是跨浏览器,则承诺:https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/Promise.jsm/Promise
甚至更现代但不支持的ATM异步等待:https://jakearchibald.com/2014/es7-async-functions/
答案 2 :(得分:0)
你可以使用Promise
或callback
来解决这个问题,Promise是更现代,更清洁的做事方式:
无极:
function foo() {
return new Promise(function(resolve, reject) {
// do some work
resolve(optionalParam);
// something caused an error whoops
reject(optionalParam);
})
}
function bar() {
// do something
};
// Call bar only once foo finishes
foo().then(function() {
bar();
}, function() {
// this is the reject case an error here
});
Promise能够被链接,这意味着如果bar是Promise,我们可以将另一个then
事件链接到那个。
您也可以使用回调来解决问题
function foo(cb) {
var data = 'alex';
cb(data);
}
function bar(name) {
// some processing
console.log(name);
}
// Call foo, then execute bar when foo finishes
foo(function(data) {
bar(data); // alex would be logged once the callback fires
});
在这里的回调示例中,我们传递一个函数作为参数,一旦运行的功能块遇到你对cb参数的调用,它就会调用模拟异步的函数。请记住它不会停止该函数的执行上下文。如果我们有类似的代码:
function foo(cb) {
var data = 'alex';
cb(data);
console.log('this is after so don't print it'); <-- still prints
};
当回调在事件队列上完成时间时,将打印最终的console.log
(当然,除非您在CB中触发偶数,如http请求,其中日志将触发,然后http请求将完成后)。
要停止最后一个控制台日志,你需要明确地告诉javascript在调用cb时返回以防止在该方法中进一步执行,并且个人这是我支持Promises的地方,一旦你解决或拒绝承诺执行上下文该功能范围已停止。