【发布时间】:2019-06-12 16:55:55
【问题描述】:
TLDR:我的 promise.response 需要在 API 调用和 promise 中调用。
我正在尝试通过简单 Express.js 服务器的 Promise 从 API 调用中获取返回值。
这似乎是一个有很多问题的话题,但我还没有成功地使实现适应这种情况。我也试过:
- 将 API 调用放在 resolve() 中
- 异步/等待实现(愿意重温)
以下是相关代码的基本结构。问题所在的部分上方有一条评论。
承诺
const externalModule = require('<route to module>');
let promise = new Promise(function(resolve,reject) {
// This is probably where the problem is
let returnValue = externalModule.apiCall(parameters);
resolve(returnValue);
});
promise.then(function(returnValue) {
console.log(returnValue);
});
外部模块
module.exports = {
apiCall: function(parameters) {
apiCall(
parameters,
function(err, response) {
if (err) {
console.error(err);
return;
} else {
console.log("success");
return response
}
}
)
}
};
如果代码运行正常,我们会看到两个字符串。一个来自 API 调用内部(“成功”),另一个来自它的返回值。因为 undefined 出现在“成功”之前,我们知道 resolve 函数在它上面的函数返回之前已经触发了。
Shell 中的日志
> undefined
> "success"
【问题讨论】:
-
你应该让外部模块返回一个承诺。
resolve()不会神奇地等待返回值 -
您的内部 API 调用似乎是异步的,您忽略了它。您在这里有几个选择,包括将
resolve和reject传递给apiCall并在if的相应子句中调用这两者或使apiCall返回承诺本身。这里的主要错误是您试图通过将 apiCall 包装在另一个与其调用者同步的调用周围来隐藏 apiCall 的异步性质。
标签: javascript express promise