node.js - 如何在 Promise 中使用异步函数?

标签 node.js

我正在将 Node.js 与 Express 结合使用,并尝试通过调用另一个 API 来填充 2 个数组。

我的问题是我的响应总是返回空数组。

我认为这是因为 Promise 是异步的,并且在我发送响应之前回调不会执行。

我尝试用 then 实现 async/await before 函数,但没有成功...

app.get('/test', (req, res) => {
  let APIKey = 'Udt4dOLtw4TI7mEhfSZHJ5TbgGC9q7kB';
  let SecretKey = 'HV7bzQrDmUJpVz1UyjWpy2sle9Ly/WYj';
  hitbtc.auth(APIKey, SecretKey);
  let buy = [];
  let sell = [];
  hitbtc.symbols().then(symbols => {
    symbols.forEach((symbol) => {
      let open = [];
      let timeStamp = [];
      let i = 0;
      console.log(symbol.id);
      hitbtc.candles(symbol.id, {limit: 15, period: "H1"}).then(result => {
        result.forEach(element => {
          open.push(element.open);
          timeStamp.push(element.timestamp);
        });
        tulind.indicators.rsi.indicator([open], [14], function (err, results) {
          if (results[0] > 80) {
            console.log("sell : ", symbol.id, " RSI value : ", results[0]);
            sell.push(symbol.id);
          } else if (results[0] < 20) {
            console.log("buy : ", symbol.id, " RSI value : ", results[0]);
            buy.push(symbol.id);
          }
        });
      })
        .catch(e => {
          //console.log(e);
        });
    });
    res.status(200).json({
      success: true,
      buy: buy,
      sell: sell
    })
  });
});

我期望将买卖数组归档到 res.status(200) 响应中。

感谢您的帮助。

最佳答案

您应该将响应移至 Promise 内,否则它将在您从 API 获取结果之前执行

使用您的代码的示例:

app.get('/test', (req, res) => {
    let APIKey = 'Udt4dOLtw4TI7mEhfSZHJ5TbgGC9q7kB';
    let SecretKey = 'HV7bzQrDmUJpVz1UyjWpy2sle9Ly/WYj';
    hitbtc.auth(APIKey, SecretKey);
    let buy = [];
    let sell = [];
    hitbtc.symbols().then(symbols => {
        symbols.forEach((symbol) => {
            let open = [];
            let timeStamp = [];
            let i = 0;
            console.log(symbol.id);
            hitbtc.candles(symbol.id, {limit: 15, period: "H1"}).then(result => {
                result.forEach(element => {
                    open.push(element.open);
                    timeStamp.push(element.timestamp);
                });
                tulind.indicators.rsi.indicator([open], [14], function (err, results) {
                    if (results[0] > 80) {
                        console.log("sell : ", symbol.id, " RSI value : ", results[0]);
                        sell.push(symbol.id);
                    } else if (results[0] < 20) {
                        console.log("buy : ", symbol.id, " RSI value : ", results[0]);
                        buy.push(symbol.id);
                    }
                });

                res.status(200).json({
                    success: true,
                    buy: buy,
                    sell: sell
                });

            })
            .catch(e => {
                //console.log(e);
            });
        });
    });
});

关于node.js - 如何在 Promise 中使用异步函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58041652/

相关文章:

node.js - 在 Meteor 应用程序中调用 exec 时出现错误 - 最大调用堆栈大小超出未定义

JavaScript 自定义 JSON 名称 Childs

node.js - socket.io 中的 pingtimeout 和 pingInterval

node.js - 获取当前语言 next-i18next

node.js - Mocha 测试失败,错误来自 "before all"钩子(Hook)

node.js - 带有 NodeJS 的 IExpress 安装后批处理没有立即找到 NPM

node.js - VS Code - 从 node.js 项目生成 UML

javascript - Casperjs iframe 未加载

node.js - 在继续主函数之前如何获取回调函数的结果?

ruby-on-rails - 使用单独的前端/后端服务器将应用程序部署到 Heroku