Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js-在另一个方法完全执行后调用该方法_Javascript_Node.js_Asynchronous_Promise_Rsvp Promise - Fatal编程技术网

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个是使用最广泛的

  • 回调。可以将第二个方法作为参数传递给第一个方法。然后在第一种情况下,在任务完成后执行传递的回调。这种方法的缺点在节点社区中通常被称为“回调地狱”。如果方法不是2,而是更多,那么您必须越来越多地传递和嵌套回调,从而创建一个巨大的嵌套结构

  • 使用承诺。有许多库实现promises模式。简而言之,承诺允许您从每个方法返回一个承诺对象。承诺是一个目标,它将在未来完成它的工作。它允许您对它调用方法,让它知道一旦完成需要发生什么。有关更多信息,请参阅本文:

  • 我知道承诺,但我不知道如何把它写进信里

    假设
    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