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

标签 node.js

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

例如这段代码:

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

如何在使用或不使用模块的情况下让这些函数按顺序一一运行?

最佳答案

因为在 Google 请求代码中,您正在调用回调而不等待答复。正确的做法应该是:

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

因此,如果只有 google 响应到达,执行就会转到下一个函数。

关于node.js - 如何在 Node.js 中强制同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10643072/

相关文章:

javascript - S3 putObject 回调不返回预期的对象

javascript - 为什么 Node 不作为 Express 的依赖项包含在内?

javascript - 使用 Mongoose 处理六个文档后,我得到 "Failed to load resource: net::ERR_EMPTY_RESPONSE"

javascript - 如何在 Promises 上冒泡错误而不在每个级别调用 `catch`?

javascript - 建立连接时出错:尝试建立并连接到 websocket 服务器时抛出 net::ERR_SSL_PROTOCOL_ERROR

javascript - 对象在匿名函数中被视为未定义,但在其之前则不然

node.js - 使用elastic.js查询与过滤器匹配的元素数量?

javascript - 如何使用 socket.io 设置和读取 cookie?

sql-server - 具有 SQL Server (Microsoft) 数据库连接的 Node

javascript - 使用 node.js 和 ES6/ES7 功能逐行读取 CSV 文件