Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在异步循环中等待承诺_Javascript_Node.js_Loops_Promise - Fatal编程技术网

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库覆盖的传统回调。