5

我有两种简单的方法:

 function do(x,y){
   if(x){
    XHR1().success();
   }
   if(y){
    XHR2().success();
   }
}

function done(){
   return something;
}

现在我只想确保在完成done()时调用do()(**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

4

3 回答 3

5

我知道承诺,但我不知道如何将它放入 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);
于 2014-02-20T16:41:32.570 回答
4

由于 node.js 本质上是异步的,正常的命令式控制流不再起作用。您有多种选择,其中 2 种使用最广泛。

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

  2. 使用承诺。有许多实现承诺模式的库。简而言之,promise 允许您从每个方法返回一个 Promise 对象。Promise 是一个对象,它将在未来完成它的工作。它允许你调用它的方法,让它知道一旦完成需要发生什么。查看这篇文章以获取更多信息:了解 node.js 中的 Promise

于 2014-02-20T16:07:45.293 回答
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()方法添加回调。

于 2014-02-20T15:59:53.557 回答