同步与异步Nodejs

时间:2015-07-06 23:59:44

标签: javascript node.js asynchronous automation synchronous

我使用Mocha测试框架自动化网页,并提出了同步和异步代码这两个术语。 我发送HTTP请求时熟悉同步和异步事件......但我从来没有听说过代码是同步和异步的。 任何人都在努力解释......我在之前的问题中看到它与回调有关,但即便如此,我仍然对这个概念感到困惑。

3 个答案:

答案 0 :(得分:3)

以下是我的服务器代码的简化版本。我演示了同步代码(开始执行操作后,在完成之前不会开始进一步操作)和异步代码(您开始执行操作,然后继续执行其他操作,稍后您将“回调”或从第一次操作中获得结果。)

这会产生一些重要的后果。几乎每次调用异步函数时都会:

  • async函数的返回值没用,因为函数会立即返回,但查找结果需要很长时间。

  • 您必须等到执行回调函数才能访问结果。

  • 调用异步函数之后的代码行将在异步回调函数运行之前执行。

例如,下面代码中console.logs的顺序为:

line 3 - before sync
line 8 - after sync, before async
line 16 - after async call, outside callback
line 14 - inside async call and callback



// synchronous operations execute immediately, subsequent code
// doesn't execute until the synchronous operation completes.
console.log('line 3 - before sync');
var app = require('express')();
var cfgFile = require('fs').readFileSync('./config.json');
var cfg = JSON.parse(cfgFile);
var server = require('http').createServer(app);
console.log('line 8 - after sync, before async');

// When you call an asynchronous function, something starts happening,
// and the callback function will be run later:
server.listen(cfg.port, function(){
  // Do things that need the http server to be started
  console.log('line 14 - inside async call and callback');
});
console.log('line 16 - after async call, outside callback');

答案 1 :(得分:0)

同步代码将严格逐行处理,而异步代码将继续到下一行,而前一行代码仍在处理中。

对于异步代码,在以下代码段中,您希望在World之前将Hello记录到控制台,因为数据库查询需要更多计算机资源,因此需要更多时间。 console.log('World')将在查询之前完成执行。

var Person = mongoose.model('Person', personSchema);

Person.findOne({ 'name.last': 'Ghost' }, function(err, person) {
  if(err) 
    throw err;
  else
    console.log('Hello');
});

console.log('World');

在同步代码中,Hello将在World之前被记录,因为查询在执行任何后续行之前完成执行。

答案 2 :(得分:0)

同步代码基本上意味着代码行按写入顺序执行。同步事件将立即执行相关的回调,就像直接函数调用一样,因此最终结果是相同的。

通常,异步代码是从调用代码中单独执行的。例如调用setTimeout将立即返回并执行下一个表达式,但它将启动一个操作,在将来的某个时刻它将触发一个调用指定回调的异步事件

Mocha测试框架支持两种类型的代码,并为异步代码提供done()回调。 done()是让Mocha知道测试何时完成的回调。

异步测试代码,来自http://mochajs.org/

describe('User', function() {
  describe('#save()', function() {
    it('should save without error', function(done) { // done is a callback
      var user = new User('Luna');
      user.save(function(err) { // save is async db call that starts here, completes whenever
        if (err) throw err;
        done();
      });
    });
  });
});

测试同步代码不需要done(),测试代码应按顺序执行。因此,当执行最后一个表达式时,测试结束。