【发布时间】:2018-02-06 08:56:53
【问题描述】:
您好,我正在继续学习 Promise,并且正在努力解决如何正确使用 Promise.All 或者我是否应该在这种情况下使用它。
我正在连接到一个数据源并将我的第一个承诺解析为一个数组。之后,我想获取这些结果,并通过另一个 Promise 循环遍历结果,并向使用外部 API 调用的数组添加另一个值。
经过研究,听起来我需要使用 Promise.All 以便在返回我的响应之前完成承诺,但我仍然处于待处理状态,即我添加到数组中的值而不是预期值.同样,我只是在学习节点和承诺,所以我的方法可能完全有缺陷,在这种情况下,我愿意接受任何关于更好地完成我想要完成的工作的建议。
function GetSearches(req, res) {
var BingSearches = new Promise((resolve, reject) => {
GetBingSearches().toArray((err, response)=>{
resolve(response);
});
}) /* get data from external data source example data: [{SearchTerm: "Boxing", id: '4c142f92-ba6d-46af-8dba-cb88ebabb94a', CreateDate: '2017-08-10T13:59:20.534-04:00'}] */
var GetSearchesWithImageUrl = BingSearches.then((response,reject) =>{
for(var i in response){
response[i].Image = new Promise((resolve, reject) => {
Bing.images(response[i].SearchTerm, {
count: 1
}, (err,res,body) => {
const bingImageUrl = body.value[0].contentUrl;
console.log(bingImageUrl) // bing image url link
resolve(bingImageUrl);
});
});
} // loop through array and add value
return response;
}).catch((err) => {
console.log(err);
})
return Promise.all([BingSearches ,GetSearchesWithImageUrl ]).then(([BingSearches , GetSearchesWithImageUrl ]) => {
console.log(GetSearchesWithImageUrl )
/* my response is now [{SearchTerm: "Boxing", id: '4c142f92-ba6d-46af-8dba-cb88ebabb94a', CreateDate: '2017-08-10T13:59:20.534-04:00', Image: Promise { pending } }] */
res.status(200).json(GetSearchesWithImageUrl )
}).catch((err) => {
console.log(err);
})
}
我希望 Promise.All 会等待我的所有承诺完成,但我似乎不明白它是如何工作的。我愿意接受任何关于我做错了什么的建议/解释。
谢谢!
【问题讨论】:
-
你打电话给
return Promise.all([Searches,Images]),但我没有看到任何地方定义了Searches或Images。它们是什么? -
在
Promise.all([Searches,Images])中似乎搜索和图像是未定义的,不是吗? -
应该是
Promise.all([BingSearches, GetSearchesWithImageUrl])吧 -
这段代码看起来很遥远。请“用文字”描述您想要实现的目标(无需我们猜测),以便我们建议修复版本。
-
另外,由于操作应该在最低级别进行承诺,我们可能需要知道
GetBingSearches()正在做什么才能提供最佳答案。
标签: javascript promise