执行http.get的Promise返回为“待处理”

时间:2019-06-26 02:03:33

标签: node.js promise

我建立了一系列承诺。有些承诺要求在解决之前先创建http.get()。其他人则没有这个决心。我将所有的诺言推到一个数组,然后进行迭代。包括http.get()在内的承诺仍在执行中。

我试图做promise.all。我试过用resolve(200)替换http.get()。这始终会执行承诺。

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 个答案:

答案 0 :(得分:1)

GeneratePromise()起,它确实返回了200。挂起的原因是调用此函数的原因是,在您调用GeneratePromise()函数时,它不会等待承诺解决。

简而言之,一个承诺可以分为三个阶段(pendingfulfilledrejected)。当您输出承诺时,它仍处于待处理状态(尚未resolvedrejected

您可以做的是使用asyncawait关键字来指示程序阻止执行直到承诺被解决,将承诺从pending阶段转到{{1 }}。

fulfiled

答案 1 :(得分:0)

我认为,如果您有一个承诺数组,那么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

相关问题