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

时间:2017-05-07 13:07:22

标签: javascript node.js request-promise

我有node.js这个问题,我在启动我的应用程序时使用了节点--trace-sync-io,当我使用请求模块和请求承诺模块在我的server.js文件上进行api调用时,它仍然警告我正在使用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)))

1 个答案:

答案 0 :(得分:1)

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

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

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

crypto.randomBytes()在此处同步调用,这就是您收到警告的原因。

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

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