【问题标题】:Is it OK to use some synchronous code in nodejs在nodejs中使用一些同步代码可以吗
【发布时间】:2013-01-08 08:47:34
【问题描述】:

我了解对于 I/O 操作(即数据库查询、Web 请求和磁盘访问),您必须使用这样的回调

fs = require('fs')
fs.readFile('test.txt', 'utf8', function (err,data) {
  if (err) {
    return console.log(err);
  }
  console.log(data);
});

但是说如果你有这样的同步代码

function Player(name){
    this.name = name;
    this.score = 0;
}
Player.prototype.calcScore = function(){
    //some special code here to calculate the score
    this.score =+ 10;
}
var player = new Player("Sam");
player.calcScore();
console.log(player);

或者你需要像下面这样的回调风格来编写它,其中 calcScore 方法可能只包括一个 for 循环和一个 if 语句并且不查询数据库等。

function Player(name){
    this.name = name;
    this.score = 0;
}

Player.prototype.setScore = function(data){
    this.score = data
}

Player.prototype.calcScore = function(callback){
    //some special code here to calculate the score
    var newscore = this.score += 10;
    callback(null, newscore);
}

var player = new Player("Sam");

player.calcScore(function(err, data){
    if(err){
        return console.log(err);
    }
    player.setScore(data);
    console.log(player);
});

我想我有点困惑,何时使用异步代码或同步代码。提前感谢您的帮助。

【问题讨论】:

    标签: javascript node.js asynchronous callback


    【解决方案1】:

    当您所做的只是 JavaScript 语句时,您无需设置异步回调。当您的代码处理“现实世界”时,会使用异步 API。当您访问 IO 设备或网络时,会使用异步 API,因为活动中存在不可预测的延迟。

    如果您要进行大量的计算,可以通过一些方法来设置允许定期中断工作的“延续”模型,但这并不是一回事。 p>

    edit — 一条评论明智地指出,使用异步 API 设计子系统确实没有什么坏处,即使它并不是真正必要的。我还要注意,使用回调进行设计并不是为异步机制完成的。充分利用 JavaScript 函数即值的灵活性的理由。

    【讨论】:

    • 我要补充的另一条评论是,如果您怀疑将来某些同步代码可能会更改为异步(例如,您现在将“分数”数据存储在内存中,但可能会像您一样将其存储在数据库中放大),那么您不妨先以异步方式编写它,以尽量减少以后的重构。
    • 感谢 Pointy 和 Iftah,这就是你们所说的快速响应。
    • 我只想补充一点,扩展 node.js 的关键是尽可能少地阻塞。
    猜你喜欢
    • 2014-07-06
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多