Javascript 在异步循环中等待承诺
为什么此代码段不能按预期工作,因此在对象填充数据之前调用Javascript 在异步循环中等待承诺,javascript,node.js,loops,promise,Javascript,Node.js,Loops,Promise,为什么此代码段不能按预期工作,因此在对象填充数据之前调用console.debug(images)?我希望两个循环并行运行,但等待承诺。所有都应该等待循环完成。第一个循环和第二个循环应该同时运行 const images = { taskImages: [], solutionImages: [] }; await Promise.all(Object.keys(files).map((key) => { files[key].map(async (file)
console.debug(images)
?我希望两个循环并行运行,但等待承诺。所有都应该等待循环完成。第一个循环和第二个循环应该同时运行
const images = {
taskImages: [],
solutionImages: []
};
await Promise.all(Object.keys(files).map((key) => {
files[key].map(async (file) => {
const fileId = getFileId(file.path);
const result = await storeImage(fileId, file.path);
if (result) {
images[key].push(fileId);
console.debug("Pushed " + key);
}
});
}));
console.debug(images);
外部.map()
调用中的函数不返回任何内容,因此Promise.all
不会得到任何要等待的承诺
解决方案只是将内部的map()
包装在Promise.all(…)
中,然后返回:
await Promise.all(Object.keys(files).map((key) => {
return Promise.all(files[key].map(async (file) => {...}));
}));
外部.map()
调用中的函数不返回任何内容,因此Promise.all
不会得到任何要等待的承诺
解决方案只是将内部的map()
包装在Promise.all(…)
中,然后返回:
await Promise.all(Object.keys(files).map((key) => {
return Promise.all(files[key].map(async (file) => {...}));
}));
简单解决方案1:
解决方案2:
你也可以使用
npm异步库
简单解决方案1:
解决方案2:
你也可以使用
npm异步库
您必须在变量上定义wait<代码>常量承诺=等待承诺。全部([])
@Baruch我不这么认为。你必须在变量上定义wait<代码>常量承诺=等待承诺。全部([])代码>@Baruch我不这么认为。它是有效的,但这是否意味着外部循环等待内部循环完成?我希望外部循环开始内部循环,而外部循环继续。因此,每个循环动作都应该在自己的“线程”中运行。@Twister21只有wait
会停止函数的执行<代码>承诺。all
只返回一个新的承诺,该承诺收集您给予它的所有承诺。@Twister21-只有一个Javascript“线程”,因此考虑在自己的线程中运行的循环的每次调用并不是一个好方法await
暂停执行async
函数,直到承诺解析,然后在等待该承诺解析时让其他事件得到处理,这样它就可以恢复该函数的执行。当该承诺解决时,它必须回到事件队列中,并等待其他任何正在运行的事件完成,然后才轮到它继续执行该函数。它可以工作,但这是否意味着外部循环等待内部循环完成?我希望外部循环开始内部循环,而外部循环继续。因此,每个循环动作都应该在自己的“线程”中运行。@Twister21只有wait
会停止函数的执行<代码>承诺。all只返回一个新的承诺,该承诺收集您给予它的所有承诺。@Twister21-只有一个Javascript“线程”,因此考虑在自己的线程中运行的循环的每次调用并不是一个好方法await
暂停执行async
函数,直到承诺解析,然后在等待该承诺解析时让其他事件得到处理,这样它就可以恢复该函数的执行。当该承诺得到解决时,它必须回到事件队列中,等待其他任何正在运行的事件完成,然后才轮到它继续执行该函数。当有本机解决方案做同样的事情时,为什么还要使用过时的第三方解决方案(如async library)呢?代码应该以文本形式发布,正确格式化为代码,而不是图像。无法搜索图像、无法复制和粘贴图像等。。。和格式正确的文本相比,它们的用处要小得多。我同意埃斯特斯的观点。承诺是管理异步操作的Javascript的现在和未来,而不是异步库。我们应该只教新手承诺,await
和async
,而不是用async库覆盖的传统回调。当有本地解决方案可以做同样的事情时,为什么还要用async库这样过时的第三方解决方案呢?代码应该以文本形式发布,以代码的形式正确格式化,而不是以图像的形式发布。无法搜索图像、无法复制和粘贴图像等。。。和格式正确的文本相比,它们的用处要小得多。我同意埃斯特斯的观点。承诺是管理异步操作的Javascript的现在和未来,而不是异步库。我们应该只教新手承诺,wait
和async
,而不是用async库覆盖的传统回调。