我有两个JS函数。一个叫另一个。在调用函数中,我想调用另一个函数,等待该函数完成,然后继续。例如,伪代码:
function firstFunction(){
for(i=0;i<x;i++){
// do something
}
};
function secondFunction(){
firstFunction()
// now wait for firstFunction to finish...
// do something else
};
我想出了这个解决方案,但不知道这是否是一个明智的方法。
var isPaused = false;
function firstFunction(){
isPaused = true;
for(i=0;i<x;i++){
// do something
}
isPaused = false;
};
function secondFunction(){
firstFunction()
function waitForIt(){
if (isPaused) {
setTimeout(function(){waitForIt()},100);
} else {
// go do that thing
};
}
};
这合法吗?有没有更优雅的处理方法?也许用jQuery?
等待一个函数首先完成的一个优雅方法是使用带有async/wait函数的Promises。
setTimeout
来演示执行指令需要一些时间的情况
例:
js lang-js prettyprint-override"> //1. Create a new function that returns a promise
function firstFunction() {
return new Promise((resolve, reject) => {
let y = 0
setTimeout(() => {
for (i=0; i<10; i++) {
y++
}
console.log('Loop completed.')
resolve(y)
}, 2000)
})
}
//2. Create an async function
async function secondFunction() {
console.log('Before promise call.')
//3. Await for the first function to complete
const result = await firstFunction()
console.log('Promise resolved: ' + result)
console.log('Next step.')
};
secondFunction()
使用异步/等待:
async function firstFunction(){
for(i=0;i<x;i++){
// do something
}
return;
};
然后在其他函数中使用wait等待返回:
async function secondFunction(){
await firstFunction();
// now wait for firstFunction to finish...
// do something else
};
处理此类异步工作的一种方法是使用回调函数,例如:
function firstFunction(_callback){
// do some asynchronous work
// and when the asynchronous stuff is complete
_callback();
}
function secondFunction(){
// call first function and pass in a callback function which
// first function runs when it has completed
firstFunction(function() {
console.log('huzzah, I\'m done!');
});
}
根据@Janaka Pushbagumara的建议,您现在可以使用箭头函数来实现同样的事情。例如:
firstFunction(()=
更新:我很久以前就回答过这个问题,并且真的很想更新它。虽然回调绝对没问题,但根据我的经验,它们往往会导致代码更难阅读和维护。不过,在某些情况下,我仍然使用它们,比如将进度事件等作为参数传递。这次更新只是为了强调替代方案。
另外,最初的问题没有具体提到异步,所以如果有人混淆了,如果你的函数是同步的,它会在调用时阻塞。例如:
doSomething()
// the function below will wait until doSomething completes if it is synchronous
doSomethingElse()
如果像暗示的那样函数是异步的,那么我今天处理所有异步工作的方法是使用async/wait。例如:
const secondFunction = async () => {
const result = await firstFunction()
// do something else here after firstFunction completes
}
在我看来,async/await使您的代码比直接使用promise(大多数情况下)更具可读性。如果您需要处理捕获错误,请将其与try/catch一起使用。请在此处阅读更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function .
问题内容: 我正在尝试在Node.js / Express中创建一个路由,该路由从两个查询中读取数据,然后基于来自查询的数据来增加计数。由于Node.js是异步的,因此在读取所有数据之前会显示总计。 我创建了一个简单的示例,以达到我目前正在做的事情 我不确定要等到两个功能都完成后才能打印总计,我该做什么。我是否需要创建一个自定义事件发射器来实现这一目标? 问题答案: 拥抱异步性: 或使用Promi
我有一个加载页面,我想在其中对不相关的信息执行两个网络请求(rxjava)。在这两个请求完成之前,我不想进入下一页,即使其中一个或两个都失败了。 > 使用zip将请求绑定在一起。有没有办法不必被迫使用双函数,也不必返回null? 请求A和B有一个。doOnNext和。多恩。如果其中一个返回错误,zip observable是否继续?zip订阅服务器是否也会返回错误? 这是最好的方法吗?
我正试图通过迁移当前使用Angular1/AngularJS编写的应用程序来提高我对Angular2的了解。 有一个特征特别难倒了我。我试图复制一个功能,其中调用函数等待继续,直到它正在调用的函数完成了一个循环的promise。在AngularJS中,我调用的函数基本上是这样的: 它包含一个调用另一个函数()的循环,该函数还返回一个promise,并将所有返回的promise存储在一个数组中。 使
问题内容: 这是我的情况: 在this.handleFormSubmit()上,我正在执行this.setState() 在this.handleFormSubmit()内部,我正在调用this.findRoutes(); -取决于this.setState()的成功完成 this.setState(); 在this.findRoutes被调用之前没有完成… 在调用this.findRoutes(
我必须使用axios提出请求,以便获取一些数据,这些数据应该作为道具传递给React组件。下面是我的渲染函数: FateChBoardList是一个异步函数,因此它将返回一个promise。我可以将然后和捕获处理程序附加到返回promise,但在这种情况下,我必须在两个处理程序中放入相同的超文本标记语言代码。还有别的办法吗?