0

我建立了一系列的承诺。一些承诺需要在解决之前进行 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 也成为返回值,而不是挂起。

4

2 回答 2

1

由于 from GeneratePromise(),它确实是返回一个200。您获得待处理的原因是调用此函数的位置没有等待您调用该GeneratePromise()函数时的承诺解决。

简而言之,一个 Promise 可以有 3 个阶段 ( pending, fulfilled, rejected)。当您输出承诺时,它仍然处于未决状态(尚未resolvedrejected

您可以做的是使用async,await关键字来指示程序阻止执行,直到 promise 解决,将 promise 从pendingstage 变为fulfiled.

exports.RegisterHTTPDependency = async function(url, name, severity) {
  let promise = [];
  let pr = await GeneratePromise(url);
  promise.push(pr, name, severity)
  promises.push(promise)
}
于 2019-06-26T02:29:06.310 回答
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

于 2019-06-27T01:38:05.497 回答