映射中的Javascript映射等待响应
我有一系列问题。映射中的Javascript映射等待响应,javascript,react-native,asynchronous,promise,async-await,Javascript,React Native,Asynchronous,Promise,Async Await,我有一系列问题。 每个问题都有一些答案,这些答案是一些要上传的文件。 一切进展顺利,而不是API调用没有等待Promise.all完成 以下是步骤: 通过问题数组映射,如果问题是imagetype,则获取所有文件并尝试上载它们 上传后,解析上传的所有承诺,并添加问题的答案Promise.all()的结果 完成所有问题的循环后,进行API调用以保存到DB中,DB现在不等待上载所有文件并解决该数组中的所有问题 导出函数sendReview(任务ID、公司ID、问题、导航){ 返回异步(调度)=
每个问题都有一些答案,这些答案是一些要上传的文件。
一切进展顺利,而不是API调用没有等待Promise.all完成 以下是步骤:
image
type,则获取所有文件并尝试上载它们
Promise.all()的结果代码>
导出函数sendReview(任务ID、公司ID、问题、导航){
返回异步(调度)=>{
分派(actions.sendReview.pending());
试一试{
让用户=等待getUser();
user=JSON.parse(user);
questions.map(异步问题=>{
如果(question.type==='image'){
让图像=问题。答案;
如果(images.length>0){
const results=images.map(异步映像=>{
返回wait wait imageApi.upload(图像)。然后(res=>{
返回res.url;
});
});
问答=等待承诺。全部(结果)。然后(完成=>{
返回已完成;
});
}
}
});
常量数据=等待任务sapi.sendReview({
任务id:taskId,
公司id:companyId,
user\u id:user.id,
问题:JSON.stringify(问题)
});
如果(data.status==201){
标记已完成(任务ID);
导航。导航('MyTasks');
分派(actions.sendReview.success({}));
}
否则{
分派(actions.sendReview.error());
}
}捕捉(错误){
分派(actions.sendReview.error(err));
}
};
}
下面是使用的函数
如何确保
.map()
中的所有项都已准备就绪,并在调用API后立即执行?使用Promise.all
在数组中等待承诺
Promise.all(questions.map(…)
给你一个我不久前编写的代码示例:
await Promise.all((await readdir(repoPath, "utf8")).map(async file => {
if (!/\.mjs$/.test(file)) return;
const filePath = `${repoPath}/${file}`;
log(`importing "${file}"`);
const module = await import(filePath);
const meta = {
repository,
file,
filePath,
description: module.description || {}
};
module.default((...args) => createModule(meta, ...args));
}));
如果您有异步映射处理程序,则需要记住,结果映射的内容包含承诺
Promise.all()
会帮你的
在您的情况下,您需要做的只是更改:
questions.map(async(question) => {
if(question.type === 'image'){
let images = question.answer;
if(images.length > 0){
const results = images.map(async (image) => {
return await imageApi.upload(image).then(res => {
return res.url;
});
});
question.answer = await Promise.all(results).then((completed) => {
return completed
});
}
}
});
详情如下:
await Promise.all(questions.map(async(question) => {
if(question.type === 'image'){
let images = question.answer;
if(images.length > 0){
const results = await Promise.all(images.map(async (image) => {
return await imageApi.upload(image).then(res => {
return res.url;
});
}));
question.answer = results.then((completed) => {
return completed
});
}
}
}));
在Promise.all中包装.map(),以及其他一些小的更改使它起作用。我没有考虑它,因为我的.map()没有返回承诺数组,但在Promise.all()中包装.map()有帮助。弄明白这一点很痛苦。我花了相当长的时间进行调试。在内部循环中,您正在执行
等待承诺。所有(结果)
。在外环上,你什么也没做!你