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 - 在另一个方法完全执行后调用一个方法的主要内容,如果未能解决你的问题,请参考以下文章

单击按钮后执行 Node.js 子进程

回调函数的使用场合

Node.js学习笔记——模块调用

node.js学习笔记_模块调用

node js异步IO机制

如何在Node.js中获取两个表数据,对象在另一个对象中