在调用下一个函数之前,如何等待一个函数完成呢
How can one wait for a function to complete before the next function is called?
在调用下一个函数之前,等待函数完成的最佳方式是什么?
我有一个场景,其中连续调用两个函数,一个接一个。我需要在调用第二个之前完成第一个。
Function1();
Function2();
如何告诉代码在尝试Function2
之前等待Function1
完成?
WebDevelopment:解决方案可以是javascript或jQuery,也可以是基于Ajax的。
谢谢。。。
你可以做很多方法,但一个非常简单的例子
function first(){
// define every thing here and then at the end call your second function
function2();
}
点击此处查看更多可能性
您可以使用Promise
或callback
来解决此问题,Promises是更现代、更干净的做事方式:
承诺:
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
将打印出来(当然,除非您触发一个类似于http请求的even-in-CB,在该请求中,日志将触发,然后http请求将在之后完成)。
要停止最后一个控制台日志,您需要明确地告诉javascript在调用cb时返回,以防止该方法中的进一步执行,就我个人而言,这就是我喜欢Promises的地方,一旦您解析或拒绝promise,该函数范围内的执行上下文就会停止。
如果你在浏览器中,只需使用回调,这是最简单的跨浏览器方法。
示例:
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/
- 是否可以将一个函数输入连接到另一个函数调用的文本
- 在输入字段上有两个函数调用,一个在Blur上,一个不在Angular中
- 如何在Javascript函数调用中循环变量
- Javascript:应为赋值或函数调用,但实际看到的却是表达式
- 如何远程检查JavaScript应用程序的函数调用堆栈
- javascript函数调用不起作用
- 为什么这个函数调用会破坏程序并导致未定义的变量
- 如何通过函数调用设置图像的src
- 从全局函数调用Ember控制器上的方法
- 为什么Jquery$.ajax在函数调用中触发所有statusCode,即使调用成功
- JavaScript函数调用(arg1)(arg2)
- 打印链接时,将javascript函数调用到链接中
- 在函数调用中封装数据除了隐藏数据之外还有什么优点
- 无法从JavaScript中的函数调用对象属性
- 对中的函数调用进行排序是回调的唯一方法
- 函数调用方法有什么用
- Javascript:JSHint:应为赋值或函数调用,但实际看到的却是表达式
- HTML5(Bootstrap)通过函数调用运行动画
- 函数调用不起作用
- 函数中的Javascript函数调用