Node.js - 在另一个方法完全执行后调用一个方法
Posted
技术标签:
【中文标题】Node.js - 在另一个方法完全执行后调用一个方法【英文标题】:Node.js - call a method after another method is fully executed 【发布时间】:2014-03-21 16:30:28 【问题描述】:我有两个简单的方法:
function do(x,y)
if(x)
XHR1().success();
if(y)
XHR2().success();
function done()
return something;
现在我只想确保在do()
完成后调用done()
(**do() 方法包含对 Mysql DB 的异步请求)
我怎样才能做到这一点?**
显然这不会按顺序排列这些方法:
do(x=1,y=1);
done(); //this can run also if do() has not finished yet
所以我尝试了:
function do(x,y,_callback)
if(x)
XHR1().success();
if(y)
XHR2().success();
_callback();
function done()
return something;
do(x=1,y=1,done()); // this won't work the same cause callback is not dependent by XHR response
这是我用于承诺的https://github.com/tildeio/rsvp.js/#arrays-of-promises
【问题讨论】:
使用回调或承诺。 @Matt Ball 一个承诺没问题,但如果我在 do() 中有超过 1 个异步调用,我无法解决它 您必须将每个回调放在前一个中。回调之外的任何内容都将立即执行。 【参考方案1】:异步方法的流行模式是。
asyncFunc1(arguments, function(err, data)
if(err) throw err;
// Do your stuff
);
function asyncFunc1(arguments, callback)
asyncFunc2(arg, function(err, data)
if(err) return callback(err);
// Do your stuff
callback(null, result);
);
查看示例fs.readFile();
编辑
仍在使用回调,但不是那种你可以使用这样的特定模式:
function do(x,y,_callback)
var count = 0;
if(x)
count++;
XHR1().success(checkDone);
if(y)
count++;
XHR2().success(checkDone);
function checkDone()
count--;
if(!count) _callback();
function done()
return something;
do(x=1,y=1,done());
计数器会跟踪您进行了多少异步调用,并在所有操作完成后调用_callback
。但是您需要为XHR().success()
方法添加回调。
【讨论】:
是的,但是如果你有 function 1() if(x= 0) async1() if(y=0) async2() 怎么办? ?它们必须分开我不能在 async 1 中包含 async2 不太确定你是否发现了问题,我用更简洁的代码更新了问题,谢谢 @pstenstrm 未定义 asyncFunc2,链接不起作用。能用实际例子详细说明吗?【参考方案2】:由于 node.js 本质上是异步的,正常的命令式控制流不再起作用。您有多种选择,其中 2 种使用最广泛。
回调。您可以将第二种方法作为参数传递给第一种。然后首先,在任务完成后执行传递的回调。这种方法的缺点在节点社区中通常被称为“回调地狱”。如果方法不是2个,而是更多,那么你就不得不越来越多地传递和嵌套回调,形成一个巨大的嵌套结构。
使用承诺。有许多实现承诺模式的库。简而言之,promise 允许您从每个方法返回一个 Promise 对象。 Promise 是一个对象,它将在未来完成它的工作。它允许你调用它的方法,让它知道一旦完成需要发生什么。查看这篇文章了解更多信息:Understanding promises in node.js
【讨论】:
请检查问题是否已更新更清晰的代码,我知道承诺和回调是解决方案,但我不知道如何将其放入 sintax,请帮助我【参考方案3】:我知道承诺,但我不知道如何将它放入 sintax
假设XHR()
确实返回了一个承诺,那么您的代码应该是这样的:
function do(x,y)
var requests = [];
if (x)
requests.push( XHR1() );
if (y)
requests.push( XHR2() );
return RSVP.all(requests);
function done()
return something;
do(1, 1).then(done);
【讨论】:
谢谢我需要这个,我正在使用 RSVP.js github.com/tildeio/rsvp.js/#arrays-of-promises以上是关于Node.js - 在另一个方法完全执行后调用一个方法的主要内容,如果未能解决你的问题,请参考以下文章