我建立了一系列承诺。有些承诺要求在解决之前先创建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也是一个返回值,而不是挂起。
答案 0 :(得分:1)
自GeneratePromise()
起,它确实返回了200
。挂起的原因是调用此函数的原因是,在您调用GeneratePromise()
函数时,它不会等待承诺解决。
简而言之,一个承诺可以分为三个阶段(pending
,fulfilled
,rejected
)。当您输出承诺时,它仍处于待处理状态(尚未resolved
或rejected
)
您可以做的是使用async
,await
关键字来指示程序阻止执行直到承诺被解决,将承诺从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