首页 > 解决方案 > 无法添加异步/等待,然后无法导出变量。任何帮助表示赞赏

问题描述

背景:过去两天一直在尝试通过查看本网站和其他网站的各种示例来解决这个问题,但我仍然没有得到它。每当我尝试添加回调或异步/等待时,我都无处可去。我知道这是我的问题所在,但我自己无法解决。

我不是编程背景 :( 我确信它对普通程序员来说是一个快速修复,我远低于那个水平。

当我在“就绪”块中使用console.log(final)时,它可以正常工作,当我转义该块时,如果console.log(final)-或-获取req / server信息,则输出为“未定义”,如果我使用控制台日志(准备好)

const request = require('request');

const ready =
// I know 'request' is deprecated, but given my struggle with async/await (+ callbacks) in general, when I tried switching to axios I found it more confusing.

request({url: 'https://www.website.com', json: true}, function(err, res, returnedData) {
    if (err) {
    throw err;
  }

var filter = returnedData.result.map(entry => entry.instrument_name);
var str = filter.toString();
var addToStr = str.split(",").map(function(a) { return `"trades.` + a + `.raw", `; }).join("");
var neater = addToStr.substr(0, addToStr.length-2);
var final = "[" + neater + "]";


//  * * * Below works here but not outside this block* * *
// console.log(final);


});

// console.log(final);
// returns 'final is not defined'

console.log(ready);
// returns server info of GET req endpoint. This is as it is returning before actually returning the data. Not done as async.

module.exports = ready;

下面是 website.com 返回的 JSON 的简短示例。实际调用有 200 多个“结果”对象。

我最终想要实现的是

1) 返回“instrument_name”的所有值

2) 执行一些操作(在每个值的开头添加“trades.”,在每个值的末尾添加“.raw”。

3) 将这些操作放入一个数组中。["trades.BTC-26JUN20-8000-C.raw","trades.BTC-25SEP20-8000-C.raw"]

4) 将此数组导出/发送到另一个文件。

5) 该数组将用作 websocket 连接中使用的另一个请求的一部分。由于数组的值每天都在变化,因此无法将数组硬编码到这个新请求中。

{
  "jsonrpc": "2.0",
  "result": [
    {
      "kind": "option",
      "is_active": true,
      "instrument_name": "26JUN20-8000-C",
      "expiration_timestamp": 1593158400000,
      "creation_timestamp": 1575305837000,
      "contract_size": 1,
    },
    {
      "kind": "option",
      "is_active": true,
      "instrument_name": "25SEP20-8000-C",
      "expiration_timestamp": 1601020800000,
      "creation_timestamp": 1569484801000,
      "contract_size": 1,
    }
  ],
  "usIn": 1591185090022084,
  "usOut": 1591185090025382,
  "usDiff": 3298,
  "testnet": true
}

标签: javascriptnode.jsjsonasynchronousasync-await

解决方案


final查看您的代码,我们发现与ready变量相关的两个问题。第一个是您试图console.log(final) 超出其范围

第二个问题是请求不会立即返回您的 API 请求的结果。原因很简单,你在做一个异步操作,结果只会由你的回调返回。您的ready变量只是对您的请求对象的引用。

我不确定您的代码的上下文是什么以及您为什么要module.exports准备好变量,但我想您想导出结果。如果是这种情况,我建议您返回一个异步函数,该函数返回响应数据而不是您的请求变量。通过这种方式,您可以控制如何在模块外处理您的响应。


推荐阅读