【问题标题】:calling a rest api with setInterval and promise in node.js在 node.js 中使用 setInterval 和 promise 调用 rest api
【发布时间】:2020-07-10 03:03:01
【问题描述】:

我是 nodejs 的新手。我开发了一个函数,它以一秒的间隔调用一个休息 API。

理论上我应该每秒都有一个新结果,但控制台只显示一个结果。我不知道为什么。

const https = require('https');

const url = 'https://api.binance.com/api/v3/ticker/price?symbol=BTCUSDT';

const promise = new Promise((resolve, reject) => {

  let price = '';
  const interval = setInterval(() => {

    https.get(url, (response) => {
      let data = '';

      // A new chunk of data has been received.
      response.on('data', (chunk) => {
        data += chunk;
      });

      // The whole response has been received, print out the result.
      response.on('end', () => {
        // returns formatted price
        price = JSON.parse(data).price;
        price = (price * 100) / 100;
        resolve(price)
      });
    });
  }, 1000);
});

promise.then((price) => {
  console.log('Current price ' + price);
});

【问题讨论】:

  • 承诺只解决一次。它们是一次性设备。所以,.then() 在任何给定的承诺上只会被调用一次。如果您想要重复的结果(每次调用间隔计时器一次),那么您将使用事件或回调,而不是承诺。

标签: node.js api promise setinterval binance


【解决方案1】:

承诺为feature,解决only one time。你必须创建一个新的承诺来发布新的价值。对于您的情况,event emitter 是最好的。

// const https = require("https")
const promiseOnce = new Promise(r => {
  setInterval(() => {
    const date = new Date();
    r(date);
  }, 1000);
});
promiseOnce.then(x => console.log(x)); // will resolve once

事件:: EventEmitter

const EventEmitter = require("events");
const priceEmitter = new EventEmitter();
setInterval(() => {
  const date = new Date();
  priceEmitter.emit("price", date);
}, 1000);
priceEmitter.on("price", price => {
  console.log(price); // Will emit always
});

【讨论】:

  • 你是对的,事件发射器最适合我的情况,非常感谢你的回答。
【解决方案2】:

尝试将承诺包装在 setInterval 回调中。

此外,您可能喜欢使用异步请求包,例如 got

const https = require("https")

const url = "https://api.binance.com/api/v3/ticker/price?symbol=BTCUSDT"

const interval = setInterval(() => {
  const promise = new Promise((resolve, reject) => {
    let price = ""
    https.get(url, response => {
      let data = ""

      // A new chunk of data has been received.
      response.on("data", chunk => {
        data += chunk
      })

      // The whole response has been received, print out the result.
      response.on("end", () => {
        // returns formatted price
        price = JSON.parse(data).price
        price = (price * 100) / 100
        resolve(price)
      })
    })
  })
  promise.then(price => {
    console.log("Current price " + price)
  })
}, 1000)

【讨论】:

    猜你喜欢
    • 2021-11-11
    • 2014-05-10
    • 2016-05-04
    • 2015-04-10
    • 2013-10-07
    • 1970-01-01
    • 2021-04-19
    • 2021-02-09
    • 2023-04-01
    相关资源
    最近更新 更多