Node.js 执行http.get的承诺返回“挂起”
我做出了一系列承诺。有些承诺要求在解析之前先创建http.get。其他人则没有这一点。我将所有承诺推送到一个数组,然后迭代。包括http.get在内的承诺仍然悬而未决 我已经试过做承诺了。我已尝试用resolve200替换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
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.
})