4

我有一个关于 Node.js 中的异步方法 API 的问题。

所以,我有一个函数,我们称之为longSetup(callback)

顾名思义,longSetup(callback)需要很长时间才能完成。但是,此设置可以与其他操作并行完成。所以,在longSetup()发生的时候,我也可以设置其他的东西。

因此,一旦longSetup()完成,该类就准备好执行另一个功能,例如serveData().

现在,我不知道什么时候serveData()会被调用。serveData()基于用户 I/O,可以在longSetup()完成前调用,也可以在完成后调用longSetup()。另外,我从不直接调用serveData().

确实需要longSetup()先完成才能serveData()成功执行,但我想利用longSetup()可以异步完成的事实,因此我不想实现同步版本的longSetup(); 我宁愿在那段时间进行其他设置。

由于serveData()可以随时调用,我想检查调用longSetup()时是否完成serveData()。如果完成,请继续serveData()。如果没有,请等到longSetup()完成,然后继续执行。由于longSetup()只调用一次,因此在大多数情况下我不会等待。此外,如果用户 I/O 需要时间,longSetup()也将在serveData()第一次调用时完成。

我已经经历了几个关于在执行另一个函数之前等待一个函数返回/在另一个函数之后触发一个函数等的 SO 问题和答案,并且我了解 Node 的异步方式以及为什么使用回调。但是,这是一个不同的用例,我想知道 node 是否提供了某种方式来等待另一个异步函数。

谢谢大家!

4

2 回答 2

2

@arturgrzesiak 的回答是调用serveDatalongSetup并且无法延迟执行serveData直到longSetup完成。在更仔细地阅读他的答案后进行编辑,看起来我错了,并且serveData会在longSetup. 但是,如果多个用户在设置期间请求数据,我的解决方案应该允许serveData多次调用。

var setupFinished = false;

var longSetup = function() {
    ...
    // at end:
    setupFinished = true;
}

var serveDataWrapper = function(query){
  if(!setupFinished){
    setTimeout(
      function(){
        serveDataWrapper(query);
      },
      200 //ms
    );
  } else { // setup is finished
    serveData(query);
  };
}

var serveData = function (query) {
  // longSetup is now guranteed to be complete
};

app.get('/', function(req, res){
  serveDataWrapper(req.query['query']);
});
于 2013-11-14T21:47:47.957 回答
1

我认为这可能是适合您的解决方案:

var setupInfo = { serveData : false, setupFinished : false }

var longSetup = function() {

    ...

    // at the very bottom
    if (setupInfo.serveData) {
        serveData();
    }
    setupInfo.setupFinished = true }
}

var serveData = function () {
    // at the very top
    if (!setupInfo.setupFinished){
         setupInfo.serveData = true;
         return;
    }

    ... 
}

如果您想多次使用 serveData ,则必须保留一个 counter 而不是 simple bool


不要认为 node.js 为你的任务提供了一些 API,但是肯定有外部库来处理这个问题,它们基于promise pattern. 是关于这个主题的一些相当陈旧但仍然有用的文章。

于 2013-11-14T20:58:34.910 回答