[英]Promise.all([..]).then never resolves
我有一些看起来像这样的个人承诺:
var performancePerMonth = new Promise(function(resolve, reject) {
var path = some_path;
getFromApi(path);
});
他们都使用称为getFromApi()的方法执行请求:
function getFromApi(path, callback) {
request({
method: 'GET',
url: base_uri + path,
headers: { 'TOKEN': 'MY_ACCESS_TOKEN' }
},
function (error, response, body) {
console.log('Status:', response.statusCode);
console.log('Headers:', JSON.stringify(response.headers));
console.log('Response:', body);
return body;
});
因为我需要一起运行请求并获得包含所有结果的数组,所以我将所有单独的Promises添加到Promise.all中:
exports.perform = function(req, response) {
Promise.all([performancePerMonth, performancePerPlayer,..]).then(function(results) {
console.log('Then: ', results);
}).catch(function(err) {
console.log('ERROR Promise.all');
console.log('Catch: ', err);
})
};
问题是,尽管从getFromApi()方法的日志中可以看到请求执行得很好,但结果数组永远不会返回。 该方法可以运行,但是显然永远不会到达.then
内部的函数.then
并且这样:
console.log('Then: ', results);
永远不会达到(它下面的catch函数都没有)。
似乎程序仅在执行所有请求之前运行,而忘记返回结果。
您永远都无法兑现承诺。
var performancePerMonth = new Promise(function(resolve, reject) {
var path = some_path;
getFromApi(path, resolve);
});
您的getFromApi
函数也有一个回调,但是它永远不会运行。 您可能想要callback(body);
而不是return body;
function getFromApi(path, callback)
接受一个回调参数,因此让我们将其用作request
的回调,而不是您拥有的匿名函数
function getFromApi(path, callback) {
request({
method: 'GET',
url: base_uri + path,
headers: { 'TOKEN': 'MY_ACCESS_TOKEN' }
}, callback);
}
现在,让我们使用该匿名函数,对其进行一些修改以根据需要在performancePerMonth
等中调用解析/拒绝
var performancePerMonth = new Promise(function(resolve, reject) {
var path = some_path;
getFromApi(path, function (error, response, body) {
if (error) {
reject(error);
} else {
console.log('Status:', response.statusCode);
console.log('Headers:', JSON.stringify(response.headers));
console.log('Response:', body);
resolve(body);
}
});
});
您可能要检查response.statusCode
是一个在盲目解决正文之前指示成功请求的代码-许多请求API都不将响应中返回的非2xx状态视为错误
因此,您可能需要
var performancePerMonth = new Promise(function(resolve, reject) {
var path = some_path;
getFromApi(path, function (error, response, body) {
if (error) {
reject(error);
} else {
console.log('Status:', response.statusCode);
console.log('Headers:', JSON.stringify(response.headers));
console.log('Response:', body);
if (response.statusCode >= 200 && response.statusCode < 300) {
resolve(body);
} else {
reject(response.statusCode);
}
}
});
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.