我正在从Google地图生成图像。这是一个Promise返回方法,因为我只循环结果并将结果存储到“ then”回调内的新Array变量中,但响应在那里,但未在浏览器中显示。
在我的谷歌地图生成图像功能不是一个promise return函数之前,它正在将响应发送到浏览器,但是它是一个promise return函数,因此存在响应,但controller方法未将响应发送到浏览器。
static providerMapImageGenerator(req, res) {
let providerArr = []
ProvidersRepository.getProviderInfoForMapImage()
.then(providers => {
providers.forEach(provider => {
// Generating image against each entr
MapGenerator.getMapImage(
provider.latitude,
provider.longitude,
provider.name,
provider.providerId
)
.then(res => {
// Saving record after each entry
ProviderMap.create({
providerId: provider.providerId,
url: res.Location
})
// Adding new array for response
providerArr.push({
id: provider.providerId,
url: res.Location,
lat: provider.latitude,
long: provider.longitude,
name: provider.name
})
})
.catch(err => console.log(err, "err in generating image"))
})
// Sending final response against all generated entries to user
res.send(providerArr) // this is going blank to the browser
})
.catch(error => {
// Sending error response if fails
res.send(error)
})
}
我需要providerArr响应才能在浏览器中显示。
答案 0 :(得分:1)
您的循环将继续进行,而无需等待承诺结果。您可以将async/await
与for of
循环一起使用,以执行以下操作:
ProvidersRepository.getProviderInfoForMapImage()
.then(async (providers) => {
for(provider of providers){
// Generating image against each entr
let image = await MapGenerator.getMapImage(
provider.latitude,
provider.longitude,
provider.name,
provider.providerId
);
// Saving record after each entry
await ProviderMap.create({
providerId: provider.providerId,
url: res.Location
});
// Adding new array for response
providerArr.push({
id: provider.providerId,
url: res.Location,
lat: provider.latitude,
long: provider.longitude,
name: provider.name
});
})
}
// Sending final response against all generated entries to user
res.send(providerArr) // this is going blank to the browser
})
.catch(error => {
// Sending error response if fails
res.send(error)
})
PS:未经测试
答案 1 :(得分:1)
Amadou的答案是正确的,但是它顺序执行而不是并行执行处理,等待每个MapGenerator.getMapImage()
完成之后再触发另一个请求。经过一些修改,您可以同时触发所有请求,并等待所有请求完成。
static providerMapImageGenerator(req, res) {
let providerArr = []
ProvidersRepository.getProviderInfoForMapImage()
.then(providers => {
return Promise.all(providers.map(provider => {
// Generating image against each entr
return MapGenerator.getMapImage( // ** actually return the promise so
provider.latitude, // ** Promise.all gets an array of promises
provider.longitude,
provider.name,
provider.providerId
)
.then(res => {
// Saving record after each entry
ProviderMap.create({
providerId: provider.providerId,
url: res.Location
})
// Adding new array for response
providerArr.push({
id: provider.providerId,
url: res.Location,
lat: provider.latitude,
long: provider.longitude,
name: provider.name
})
})
.catch(err => console.log(err, "err in generating image"))
})
// Sending final response against all generated entries to user
.then(() => res.send(providerArr)); // this is going blank to the browser
})
.catch(error => {
// Sending error response if fails
res.send(error)
})
}