【发布时间】:2021-06-13 00:00:58
【问题描述】:
我意识到已经有关于 Promises 和/或 Promise all 函数无法按预期工作的帖子,因为 ExpressJS 本身并不等待所有数据解析,但我很困惑为什么我的代码仍然没有等待在发回数据之前要解决的承诺。日志打印我想发送给客户端的数据。 我已经使这篇文章的函数更加通用,但函数结构没有改变。
app.get('/some-endpoint', (req, res, next) => {
if(req) {
try {
return Promise.all([executeRequest(1, 2, 3), executeRequest(4, 5, 6), executeRequest(7, 8, 9), executeRequest(10, 11, 12)]).then(function(results) {
console.log(results, 'Request results')
res.status(200).send(results);
}).catch(function(err) {
return res.status(500).send(err);
});
} catch (e) {
console.log(e);
return res.status(500).json({status: 500, message: e.message});
}
} else {
return res.status(400).json({status: 400, message: 'Bad Request'});
}
});
该端点调用一个函数 executeRequest,该函数返回一个 Promise。来自响应的“数据”和“结束”状态的数据正在通过控制台解析和记录,但响应主体当然是空的。我已经多次重构这些函数,试图遵循关于 Promises 和 Express 的其他答案和教程,但我无法让 Promise 所有结果都返回到响应正文中。我正在使用 https 模块。任何帮助将不胜感激。
function executeRequest(a, b, c) {
return new Promise(function(resolve, reject) {
var options = {
host: host,
path: '/some-other-endpoint-to-call-off-too',
method: 'GET',
port: '443',
headers : {
"Authorization" : a+b+c
}
};
const callback = function(response) {
var str = ''
response.on('data', function (chunk) {
str += chunk;
console.log(str, 'data');
});
response.on('end', function () {
console.log(str, 'on end');
resolve(str);
});
}
let req = https.request(options, callback);
req.end();
});
}
【问题讨论】:
-
谢谢@T.J.Crowder 抱歉给我带来了麻烦。除了 res.status(200).send(results) 之外,我已经根据您的 cmets 更新了代码。 then 和 catch 是在看到它失败后才添加的。
-
@T.J.Crowder 我删除了冗余发送 res.status(200).send(results) 调用的第二个 then 处理程序。这确实来自重构。我不知道这是否有任何帮助,但我可以说 Promise.all 的 then 函数调用正在记录每个单独解决的承诺的结果。修改后请求结果还是一样。
标签: javascript node.js express promise