вызывая API отдыха с помощью setInterval и обещая в node.js - PullRequest
1 голос
/ 29 марта 2020

Я новичок в 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);
});

Ответы [ 2 ]

1 голос
/ 29 марта 2020

Обещание как 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

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
});
0 голосов
/ 29 марта 2020

Попробуйте обернуть обещание внутри обратного вызова setInterval.

Также вам может понравиться использование асинхронного c пакета запроса, такого как 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)
...