【问题标题】:Node.js - call a method after another method is fully executedNode.js - 在另一个方法完全执行后调用一个方法
【发布时间】: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 个异步调用,我无法解决它
  • 您必须将每个回调放在前一个中。回调之外的任何内容都将立即执行。

标签: javascript node.js asynchronous promise rsvp-promise


【解决方案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 种使用最广泛。

  1. 回调。您可以将第二种方法作为参数传递给第一种。然后首先,在任务完成后执行传递的回调。这种方法的缺点在节点社区中通常被称为“回调地狱”。如果方法不是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);

【讨论】:

猜你喜欢
  • 2018-10-30
  • 2020-01-11
  • 2021-12-24
  • 1970-01-01
  • 2020-10-11
  • 1970-01-01
  • 2018-06-01
  • 2021-02-19
  • 2013-02-27
相关资源
最近更新 更多