如何在node.js中强制同步?

时间:2012-05-17 20:32:53

标签: node.js

我一直在努力了解如何在nodejs中强制同步,但我在大多数尝试中都失败了。

例如这段代码:

var r = require('request');
var a = require('async');

var hello = function (cb) {
  console.log('Hello from 1!');
  cb();
}

var random = function (cb) {
  console.log(Math.floor(Math.random() * 10));
  cb();
}

var google = function (cb) {
  r('http://google.com', function (err, res, body) {
    console.log(res.statusCode);
  });
  cb();
}

var bye = function (cb) {
  console.log('Bye from 3!');
  cb();
}

a.series([hello, google, random, bye], function () {
  console.log('done');
});

这不会像您期望的那样有效 - 在我的所有尝试中,Google的响应代码总是最后一次。

Hello from 1!
7
Bye from 3!
done
200

如何在使用或不使用模块的情况下逐个运行这些功能?

1 个答案:

答案 0 :(得分:2)

因为在Google请求代码中,您在不等待答案的情况下调用回调。正确的方法应该是:

var google = function (cb) {
  r('http://google.com', function (err, res, body) {
    console.log(res.statusCode);
    cb();
  });
}

因此,如果只有谷歌回复到达,执行将转到下一个功能。