Javascript Node.js-在另一个方法完全执行后调用该方法
我有两个简单的方法:Javascript Node.js-在另一个方法完全执行后调用该方法,javascript,node.js,asynchronous,promise,rsvp-promise,Javascript,Node.js,Asynchronous,Promise,Rsvp Promise,我有两个简单的方法: 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();
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
这就是我用于承诺的内容异步方法的流行模式是
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);
});
}
请参见示例
编辑
仍在使用回调,但不是特定的模式,您可以使用如下内容:
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());
计数器跟踪您进行的异步调用的数量,并在所有调用完成后调用
\u回调
。但是您需要向XHR().success()
方法添加回调。由于node.js本质上是异步的,正常的命令式控制流不再工作。您有几个选项,其中2个是使用最广泛的
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);
使用回调或承诺。@Matt Ball承诺是可以的,但如果do()中有超过1个异步调用,则无法解决该问题。您必须将每个回调放在前一个回调中。回调之外的任何内容都将立即执行。是的,但是如果函数1(){if(x=0){async1()}if(y=0){async2()}会怎么样??它们必须分开我不能在async 1中包含async2不太确定你是否发现了问题我用更干净的代码更新了问题,thanks@pstenstrm未定义asyncFunc2,且链接不工作。你们能用真实的例子详细说明吗?请检查问题是否更新了更干净的代码,我知道承诺和回调是解决方案,但我不知道如何将其放入sintax,请帮助我的人我需要这个,我使用的是RSVP.js