Обещание, которое выполняет http.get, возвращает «ожидающий» - PullRequest
0 голосов
/ 26 июня 2019

Я строю массив обещаний.Некоторые обещания требуют выполнения http.get () перед разрешением.Другие решают без этого.Я помещаю все обещания в массив, а затем повторяю их.Обещания, включая http.get (), все еще находятся на рассмотрении.

Я пытался выполнить обещание. Все.Я попытался заменить http.get () на resol (200).Это всегда выполняет обещание.

const https = require('https');
const http = require('http');
let promises = [];

exports.RegisterHTTPDependency = function(url, name, severity) {
  let promise = [];
  let pr = GeneratePromise(url);
  promise.push(pr, name, severity)
  promises.push(promise)
}

exports.Check = function() {
  let results = {};
  for (let i = 0; i < promises.length; i++) {
    const check = promises[i];
    console.log('promise: ', check[0]) // this returns "Promise { <pending> }" or 20, 
    // depending on if the resolve(20) is included in GeneratePromise
  }
}

let GeneratePromise = function(url){
    return new Promise(function(resolve, reject) {
      // resolve(20) // if I include this code, it returns 20
      http.get(url, (resp) => {
        let data = '';
        resp.on('data', (chunk) => {
          data += chunk;
        });
        resp.on('end', () => {
          resolve(resp.statusCode); // this promise does come back <pending>
        });
      }).on("error", (err) => {
        reject(err);
      });
    });
}

Значение 20 является возвращаемым значением.Я хочу, чтобы resp.statusCode также был возвращаемым значением вместо ожидающего.

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Так как с GeneratePromise() он действительно возвращает 200. Причина, по которой вы получаете ожидание, заключается в том, что эта функция вызывается не дожидаясь разрешения обещания при вызове функции GeneratePromise().

Короче говоря, обещание может иметь 3 этапа (pending, fulfilled, rejected). Когда вы выводите обещание, оно все еще ожидает (пока не resolved или rejected)

Что вы можете сделать, это использовать ключевые слова async, await, чтобы указать программе блокировать выполнение до разрешения обещания, превратив обещание с этапа pending на fulfiled.

exports.RegisterHTTPDependency = async function(url, name, severity) {
  let promise = [];
  let pr = await GeneratePromise(url);
  promise.push(pr, name, severity)
  promises.push(promise)
}
0 голосов
/ 27 июня 2019

Я думаю, что если у вас есть массив обещаний, правильный способ «ждать» их разрешения будет с помощью Promise.all ().

Promise.all(promisesArray)
  .then(result => {
    // will execute when every promise has been fulfilled
    // result is an array of the values returned by your promises.
  })

https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/Promise/all

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...