0

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

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

当我在“就绪”块中使用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
}

4

2 回答 2

0

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

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

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

于 2020-06-03T13:26:37.043 回答
0

您可以使用集成的fetchapi 而不是弃用的request. 我更改了您的代码,以便您的组件导出一个名为 的异步函数fetchData,您可以在某处导入并执行该函数。它将返回结果,并根据您的逻辑进行更新:

module.exports = {
  fetchData: async function fetchData() {
    try {
      const returnedData = await fetch({
        url: "https://www.website.com/",
        json: true
      });

      var ready = 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);

      return "[" + neater + "]";
    } catch (error) {
      console.error(error);
    }
  } 
}

我希望这会有所帮助,否则请分享更多您的代码。很大程度上取决于您想在哪里显示获取的数据。此外,您如何处理加载错误状态。

编辑:我无法从该网站获得回复,因为您需要一个帐户以及 api 的凭据。判断您的代码和您的问题:

1) 返回“instrument_name”的所有值

您的map功能有效:

var filter = returnedData.result.map(entry => entry.instrument_name);

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

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

这可以使用这个函数来完成

const manipulatedData = filter.map(val => `trades.${val}.raw`);

您现在可以manipulatedData在下一个请求中使用。能否导出此变量取决于您在其中使用它的组件。老实说,不将此逻辑拆分为两个单独的组件(关于 websocket)对我来说听起来更容易。

于 2020-06-03T13:36:32.430 回答