我有一个nodeJS Web服务器,该服务器调用另一个api获取数据,然后(理想情况下)将该数据返回到网页.我正在使用请求承诺库,并尝试使用Promise.all()无济于事.
到目前为止,我有:
app.get('/endpoint', (req, res) => {
var url = 'some url';
var dataObject = {};
var promise1 = rp(url).then( (data) => {
//process data into dataObject
}
url = 'another url';
var promise2 = rp(url).then( (data) => {
//process data into dataObject
}
//same thing for promise 3...
Promise.all([promise1, promise2, promise3]).then(res.send(dataObject));
});
问题在于res.send(dataObject)没有等待诺言完成,因此正在发送一个空对象.我对诺言不是很熟悉,因此正试图通过它来了解更多有关诺言的信息,但是事情并没有达到我的期望.如果我想知道发生了什么,则在调用rp().then()时,.then()会导致承诺得以解决,然后在“解决”之后在.then()中执行代码.
我想要的是执行.then()中的代码,然后一旦所有promise完成各自的数据处理,我希望它执行.all().then()以返回该数据,但是我将如何处理这样做吗?
解决方法:
Promise.all([promise1, promise2, promise3]).then(res.send(dataObject));
对此:
Promise.all([promise1, promise2, promise3]).then(data => res.send(dataObject));
您的代码版本正在立即执行res.send(dataObject),然后将返回值传递给.then().您必须将函数引用传递给.then(),以便Promise基础结构可以在以后再调用该函数.
为了说明这一点,您的代码版本与此类似:
let f = res.send(dataObject);
Promise.all([promise1, promise2, promise3]).then(f);
可以清楚地看到,在Promise.all()之前执行res.send()即可.
相反,您想要执行以下操作:
function f() {
res.send(dataObject);
}
Promise.all([promise1, promise2, promise3]).then(f);
您显然在传递一个可以稍后再调用.then()的函数.的简化版本是:
Promise.all([promise1, promise2, promise3]).then(data => res.send(dataObject));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。