NodeJS等待函数执行完毕
NodeJS等待函数执行完毕
我有一个简化的函数,它看起来像这样:\n
function(query) { myApi.exec('SomeCommand', function(response) { return response; }); }
\n基本上,我希望它调用myApi.exec
,并返回回调函数中给定的响应。然而,上面的代码无法正常工作,只会立即返回。\n只是为了一个非常笨拙的尝试,我尝试了下面的方法,它并没有成功,但至少你可以理解我试图实现什么:\n
function(query) { var r; myApi.exec('SomeCommand', function(response) { r = response; }); while (!r) {} return r; }
\n基本上,有什么好的“node.js/事件驱动”方式可以解决这个问题?我希望我的函数在回调被调用后等待,然后返回传递给它的值。
NodeJS wait for function to finish
问题的出现原因:
在NodeJS中,有时候我们希望在执行异步操作的同时等待某个函数执行完成后再继续执行下面的代码。然而,由于NodeJS的异步特性,正常情况下函数会立即返回并继续执行后面的代码,而不会等待异步操作完成。
解决方法:
为了解决这个问题,可以使用一些库或技术来实现等待函数执行完成的功能。在这里,我们介绍一个名为"waitfor-ES6"的库。这个库使用了ES6的生成器(generators)和"--harmony"标志来实现等待函数执行完成的功能。
首先,我们需要安装"waitfor-ES6"库。可以通过在终端中运行以下命令来安装:
npm install waitfor-ES6
安装完成后,我们可以在代码中使用该库来等待函数执行完成。下面是一个使用"wait.for"函数的示例:
function* (query) { var r = yield wait.for( myApi.exec, 'SomeCommand'); return r; }
在上面的示例中,我们定义了一个生成器函数,并使用"wait.for"函数来等待"myApi.exec"函数执行完成。当"myApi.exec"函数执行完成后,它的返回值会被赋给变量"r"。然后,我们可以继续执行后面的代码。
通过使用"wait.for"函数,我们可以在需要等待函数执行完成的地方暂停代码的执行,并在函数执行完成后继续执行下面的代码,从而实现了等待函数执行完成的功能。
在NodeJS中,如果我们希望等待某个函数执行完成后再继续执行下面的代码,可以使用"waitfor-ES6"库来实现。该库使用了ES6的生成器和"--harmony"标志来实现等待函数执行完成的功能。通过在代码中使用"wait.for"函数,我们可以在需要等待函数执行完成的地方暂停代码的执行,并在函数执行完成后继续执行下面的代码。
Node.js中遇到的常见问题之一是如何等待函数执行结束。一种解决方法是将API调用封装成一个Promise,并使用await
关键字等待结果。
首先,我们有一个具有成功和错误回调函数的API函数。当查询为"bad query"时,会调用错误回调函数,否则调用成功回调函数。
接下来,我们创建一个名为apiFunctionWrapper的函数来封装上述API调用并处理回调函数。我们使用Promise来包装API调用,并使用resolve和reject来处理回调函数。
现在,我们可以使用await关键字从封装的API函数中获取结果,并使用标准的try-catch语句来处理错误。我们创建一个名为businessLogic的async函数来执行此逻辑。
最后,我们调用主函数businessLogic()。
运行程序后,输出结果如下:
Your query was <query all users> ERROR:problem with the query
评论中提到这个例子很好地展示了如何将带有回调函数的函数封装起来,以便可以在async/await
中使用。这个例子写得非常清楚易懂,对于像我这样的初学者来说很容易理解。对于解决异步回调地狱问题非常有帮助。
封装带有回调函数的API是一种在Node.js中等待函数执行结束的常见解决方法。通过将API调用封装成Promise,并使用await关键字获取结果,我们可以更方便地处理异步操作。
问题:Node.js如何等待函数执行完成?
原因:在使用事件驱动系统(如Node.js)时,不应该等待函数的执行完成。应该采用回调函数的方式,当计算完成时调用回调函数。调用者不需要等待值被“返回”,而是发送处理结果值的例程。
解决方法:定义一个带有回调函数参数的函数,在函数内部执行完计算后调用回调函数将结果返回给原始调用者。调用者使用回调函数来处理返回值,而不是像处理常规(非事件驱动)返回值那样处理。
代码示例:
function(query, callback) { myApi.exec('SomeCommand', function(response) { // other stuff here... // bla bla.. callback(response); // this will "return" your value to the original caller }); } myFunction(query, function(returnValue) { // use the return value here instead of like a regular (non-evented) return value });
如果myApi.exec从未调用回调函数,如何在10秒后调用回调函数并传递一个错误值?
代码示例:
setTimeout(function() { if (!callbackCalled) { callback('error'); } }, 10000);
如果想要阻塞函数,有没有一种好的方法来实现阻塞而不是忙等待?
答案:有几种方法可以实现阻塞,但这些方法不是完美的,因为Node.js并不是为了阻塞而设计的。以下是几种方法的建议:
1. 使用C来实现函数并将其发布到NPM以供使用,这就是“sync”方法所做的事情。
2. 使用fibers库。
3. 使用promises库,例如Q库。
4. 使用像CoffeeScript这样的在JavaScript之上的轻量级层,它看起来是阻塞的,但实际上是编译成异步的。
尽管Node.js的标准是非阻塞的,但在某些情况下我们仍然需要阻塞的方法。使用回调函数是处理事件驱动系统中函数执行完成的常用方式,而避免使用阻塞方法可以提高系统的性能和可伸缩性。但在特定情况下,可以使用上述提到的方法来实现阻塞。