【发布时间】:2018-03-20 21:58:41
【问题描述】:
需要有关承诺的帮助。请参考下面的详细信息,主题更理论,我不明白我应该使用什么流程:
- 我们有异步函数 getDataFromUri(),它返回数据,这些数据被过滤并保存到对象的 arr 中,我们将其命名为 res;
- 对于数组 res 中的每个活动(对象),我想发送异步请求,该请求会将活动的产品图像存储到对象。结果,我应该有一个数组 res 存储所有过滤的数据(活动名称、活动图像);
我需要这样的东西:
[{
name: "Somename",
images: ['uri', 'uri', 'uri', 'uri', 'uri', 'uri']
},{
name: "Somename",
images: ['uri', 'uri', 'uri', 'uri', 'uri', 'uri']
}
]
- 使用 RES 数组执行一些其他操作。
此函数获取广告系列:
function getDataFromUri(uri) {
return new Promise((resolve, reject) => {
request.get(uri, (err, res, body) => {
if(err || res.statusCode !== 200 ) {
reject(handleErr(err));
} else {
resolve(body);
}
});
});
}
此函数获取活动的图像:
function getProductsOfCampaign(id) {
var productsImagesLinks = [];
return new Promise((resolve, reject) => {
getDataFromUri(`SOME_URI/${id}.json`)
.then((json) => {
var productsList = JSON.parse(json).products;
resolve (productsList.map((product) => product.imgSrc));
}).catch((e) => {
throw new Error(e);
})
});
}
这里我遇到了问题:
getDataFromUri(someLink) //Get campaings;
.then((result) => {
//NOT WORKING FOREACH
result.forEach((item, i) => {
item.images = getProductsOfCampaign(item.id);
})
return result;
})
.then((result) => {
//Do something else to array with images;
});
- 如何在 forEach .then() 表达式之后强制 next 等待保存所有图像 URL?
- 我尝试了 Promise.all(),但似乎对如何正确实施它缺乏了解。
如果您能帮我解决这个问题,我将不胜感激。谢谢。
【问题讨论】:
-
不确定它是否重复,但my answer here 显示了如何执行此操作,无论您是想串联还是并联。
-
你可以尝试使用Promise.all(),也许会改变你的一些逻辑。
-
那是因为
.forEach没有返回值,你需要使用.map,它可以返回一些东西(承诺)等待。
标签: javascript arrays asynchronous promise