【问题标题】:Node: dealing with async nature节点:处理异步性质
【发布时间】:2011-12-20 00:38:10
【问题描述】:

这让我陷入了一个循环;我不完全确定如何分阶段提出问题。我有一个具有多个属性的对象,这些属性从数据库中获取并写入数据库。一个例子可能是:

// This is an over simplified example. this._connection() returns a valid DB connection
var delay = {
  'time' : function() {
    this._connection().query('SELECT * FROM delay', function(err, result, fields) {
      return result.length ? result[0].time : 60;
    }
  }
}

现在,如果我尝试使用此代码 ....

console.log('Current Delay:' + delay.time());

正如我所料,它会打印“未定义”,因为 mySQL 回调在方法 delay() 返回之前没有执行,因此回调中的 return 没有做任何事情。

是否有一种公认的方法来处理这类事情?也许我只是无法理解 node.js/async。

【问题讨论】:

  • 我认为将 console.log 放在回调函数中是让它工作的方法
  • @Daniel Elliott:我认为你举这个例子有点过于字面了

标签: node.js


【解决方案1】:

这叫做回调

var delay = {
  'time' : function(data, cb) {
    this._connection().query('SELECT * FROM delay', function(err, result, fields) {
      if (err) {
        // return early to avoid else
        return cb(err);
      }
      cb(null, result.length ? result[0].time : 60);
    }
  }
}

delay.time(null, function (err, time) {
  console.log('Current Delay:' + time);
});

请注意,内部函数中的return 语句是无用的。 return 不会神奇地在外部函数上调用 return。那是因为函数的末尾有一个隐含的return undefined;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多