在 node.js 中使用 setInterval 和 promise 调用休息 api

calling a rest api with setInterval and promise in node.js

我是 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);
});

尝试将承诺包装在 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)

承诺 feature,解决 only one time。您必须为 post 新价值创建一个新承诺。对于您的情况,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

events:: 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
});