【问题标题】:Unable to add async / await and then unable to export variable. Any help appreciated无法添加异步/等待,然后无法导出变量。任何帮助表示赞赏
【发布时间】:2020-09-22 03:34:33
【问题描述】:

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

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

当我在“就绪”块中使用 console.log(final) 时,它可以正常工作,当我转义该块时,如果 console.log(final) -or- Get req/ 则输出为“未定义”服务器信息,如果我使用 console.log(ready)

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
}

【问题讨论】:

  • 第二个console.log(final) 未定义,因为它被调用超出范围。 finalready 变量中定义。它只在那里为人所知,外界不知道它的存在。此外,请求是一个未决的承诺。您必须在回调函数中执行您的逻辑。

标签: javascript node.js json asynchronous async-await


【解决方案1】:

查看您的代码,我们发现与finalready 变量相关的两个问题。第一个是你正在尝试console.log(final)out of its scope

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

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

【讨论】:

    【解决方案2】:

    您可以使用集成的fetch api,而不是已弃用的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);
        }
      } 
    }
    

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

    编辑: 我无法从该网站获得回复,因为您需要一个帐户以及该 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——。

    【讨论】:

    • 非常感谢您的帮助。我已经更新了网址,所以你有一些实际可用的东西。我还更新了“我最终想要实现的是”部分。 2 旁注 1)在您的示例中未调用 var ready(我相信它应该是基于以下第 2 行的“过滤器”)我无法通过控制台记录任何内容。再次感谢您提供的帮助! :)
    • 再次感谢!我 99% 确定您仍然可以在没有帐户/凭据的情况下调用 api。前几天我将它与在线 json 查看器一起使用,没有问题。为了避免混乱,这里的问题是如何使用数组 pastebin.com/b4f29QfG
    猜你喜欢
    • 2022-11-24
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 2019-04-18
    • 2013-11-12
    相关资源
    最近更新 更多