Node.js 执行http.get的承诺返回“挂起”

Node.js 执行http.get的承诺返回“挂起”,node.js,promise,Node.js,Promise,我做出了一系列承诺。有些承诺要求在解析之前先创建http.get。其他人则没有这一点。我将所有承诺推送到一个数组,然后迭代。包括http.get在内的承诺仍然悬而未决 我已经试过做承诺了。我已尝试用resolve200替换http.get。这总是履行诺言 const https = require('https'); const http = require('http'); let promises = []; exports.RegisterHTTPDependency = functio

我做出了一系列承诺。有些承诺要求在解析之前先创建http.get。其他人则没有这一点。我将所有承诺推送到一个数组,然后迭代。包括http.get在内的承诺仍然悬而未决

我已经试过做承诺了。我已尝试用resolve200替换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也是一个返回值,而不是挂起。

因为从GeneratePromise,它确实返回了一个200。得到挂起的原因是调用此函数时没有等待承诺在调用GeneratePromise函数时得到解决

简言之,一个承诺可以有三个阶段:未决、履行、拒绝。当您输出承诺时,它仍处于挂起状态,尚未解决或拒绝

您可以做的是使用async,await关键字来指示程序阻止执行,直到承诺得到解决,从而将承诺从挂起阶段转到实现阶段


我认为,如果你有一系列的承诺,等待它们解决的正确方法就是承诺

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


当您控制台.logresp?resp.statusCode打印200时会得到什么?那么get请求何时真正被触发?我看到这是可行的,但是在运行Check函数之前,我需要暂停3秒钟,这个函数会迭代承诺。如果我不停下来,就不会有承诺。看起来这并不是真正的暂停或使所有内容同步。建议的修改只会使registerHttpDependence函数中的代码同步。但是,如果您在RegisterHttpDependence之后立即以非阻塞方式调用Check,则RegisterHttpDependence的结果尚未解决。解决此问题的最简单方法是将RegisterHttpDependence转换为异步函数,并在调用Check之前等待它,但重构代码结构应该是更好的解决方案。目前,registerHttpDependence会产生副作用,检查会检查产生的副作用。最好不要让它们使用副作用进行操作。这很有道理。谢谢你的帮助。@bravinator932421不客气。如果答案解决了您的问题,请将答案标记为正确,谢谢。
Promise.all(promisesArray)
  .then(result => {
    // will execute when every promise has been fulfilled
    // result is an array of the values returned by your promises.
  })