如何使用 Node.js 进行异步 api 调用?

How to make async api call with Node.js?

我在使用 node.js 时遇到了这个问题,我在启动我的应用程序时以及在我的 server.js 上进行 api 调用时使用节点 --trace-sync-io使用请求模块和请求承诺模块的文件,它仍然警告我正在使用 Sync API 并指向我的 request.promise 调用的开始。

var request = require("request");
var rp = require("request-promise");

var options = {
    uri: url,
    json: true
};

rp(options).then(function (data){
    //then I do something with data here
}.catch(function(err){
    //catch errors here
})

所以当我使用命令 node --trace-sync-io server.js 启动节点时,我得到 WARNING: Detected use of sync API 和堆栈跟踪

(node:17212) WARNING: Detected use of sync API
at rng (mypath\node_modules\uuid\lib\rng.js:7:10)
at v4 (mypath\node_modules\uuid\v4.js:13:52)
at Multipart (mypath\node_modules\request\lib\multipart.js:11:19)
at Request (mypath\node_modules\request\request.js:127:21)
at request (mypath\node_modules\request\index.js:54:10)
at mypath\server.js:333:8
at emitOne (events.js:96:13)
at emit (events.js:188:7)
at Query.handleReadyForQuery (mypath\node_modules\pg\lib\query.js:126:8)

它指向我开始调用的行 rp(options.then(function(data)))

堆栈跟踪指向 uuid 包内的 the following functionrequest 在内部使用它来生成多部分分隔符):

var rb = require('crypto').randomBytes;

function rng() {
  return rb(16);
};

crypto.randomBytes() 在这里被同步调用,这就是你收到警告的原因。

然而,这并不一定意味着这段代码会通过阻塞事件循环而导致大问题。当然,它是同步的,所以是阻塞的,但从长远来看,我的笔记本电脑每秒可以生成大约 300K 个 UUID(上面的函数会为每个 UUID 调用)。

这意味着每次调用事件循环将被阻塞大约 3.3 微秒,在 request 的情况下,每个请求一次(我认为)。可以忽略不计。