节点异步函数返回未定义

时间:2020-06-13 06:23:15

标签: node.js rest asynchronous

var https = require('https');
async function getOrderBook(){
  var options = {
    host: 'api.bybit.com',
    port: 443,
    path: '/v2/public/orderBook/L2?symbol=BTCUSD',
    method: 'GET'
  };

  https.request(options, function(res) {
    res.on('data', function (chunk) {
      //console.log(chunk);
      return chunk;
    });
  }).end();
}

console.log(getOrderBook())

以下日志

Promise { undefined }
在控制台中

。但是,我可以从函数内部正常记录它。如何使其等待功能解析?

2 个答案:

答案 0 :(得分:1)

https.request()具有回调函数。这就是您在第二个参数中传递的函数。当您在函数内return时,您将返回那个函数的调用方,而不是 getOrderBook()。由于在任何地方都没有承诺async/await并没有真正的用处。您可以将请求包装在一个Promise中并返回,或者可以将回调传递给getOrderBook(),并在请求完成后使用数据对其进行调用。例如:

var https = require('https');

function getOrderBook(cb) {
  var options = {
    host: 'api.bybit.com',
    port: 443,
    path: '/v2/public/orderBook/L2?symbol=BTCUSD',
    method: 'GET'
  };


  https.request(options, function(res) {
    let data = ''
    res.on('data', function(chunk) {
      data += chunk;
    });
    res.on('end', function() {
      // All done, call the callback
      cb(JSON.parse(data))
    })
  }).end();
}

// pass a callback that tells it what to do with the data
getOrderBook((data) => console.log(data.result))

或者,您可以使用像axios这样的具有本机Promise支持的库。

答案 1 :(得分:0)

您可以在调用异步函数之前放置await,但是请注意,您需要处于异步函数中才能使用await

https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Op%C3%A9rateurs/await