Javascript Async Await Promise.all Array.map未按预期运行。不知道为什么

Javascript Async Await Promise.all Array.map未按预期运行。不知道为什么,javascript,node.js,es6-promise,Javascript,Node.js,Es6 Promise,我在我的一个项目中的异步函数中包含以下内容matchCamera、matchIP和matchAudio都返回布尔值或错误 如果返回一个错误,我希望它落在我的主捕获中,这样我就可以处理它,但这并没有发生 try { // .... Additional code here const typecheck = await Promise.all( evoCfg.cameras.map(async camera => { if (came

我在我的一个项目中的异步函数中包含以下内容
matchCamera
matchIP
matchAudio
都返回布尔值或错误

如果返回一个错误,我希望它落在我的主捕获中,这样我就可以处理它,但这并没有发生

try {
    // .... Additional code here

    const typecheck = await Promise.all(
        evoCfg.cameras.map(async camera => {
            if (camera.type === 'H264') {
                return await matchCamera(camera);
            } else if (camera.type === 'RTSP') {
                return await matchIP(camera);
            } else if (camera.type === 'AUDIO') {
                return await matchAudio(camera);
            } else {
                // Motion JPEG
                return true;
            }
        })
    );

    //  .... additional code here

    console.log('results:);
    console.dir(typecheck, {depth: null, colors: true});
} catch (e) {
    console.error('In Master Catch:', e);
}
当我导致错误条件时,我一直得到的输出是:

results:
[ true,
true,
true,
true,
true,
true,
Error: MAC for IP Cam not found on Network: 00:11:22:33:44:55
  at matchIP (/file.js:58:15)
  at process._tickCallback (internal/process/next_tick.js:68:7),
true ]
我期待着:

In Master Catch: MAC for IP Cam not found on Network: 00:11:22:33:44:55
  at matchIP (/file.js:58:15)
  at process._tickCallback (internal/process/next_tick.js:68:7)

该方法返回一个承诺,当作为iterable传递的所有承诺都已解析或iterable不包含承诺时,该承诺将解析。它拒绝的理由是第一个拒绝的承诺

你违背了
承诺的目的。它需要一个承诺列表,但你给出的是一个承诺值列表

const typecheckArray = await Promise.all(
  evoCfg.cameras.map(camera => {
    if (camera.type === 'H264') {
      return matchCamera(camera);
    } else if (camera.type === 'RTSP') {
      return matchIP(camera);
    } else if (camera.type === 'AUDIO') {
      return matchAudio(camera);
    } else {
      // Motion JPEG
      return Promise.resolve(true);
    }
  })
);
另外,
Promise.all
返回一个值数组

该方法返回一个承诺,当作为iterable传递的所有承诺都已解析或iterable不包含承诺时,该承诺将解析。它拒绝的理由是第一个拒绝的承诺

你违背了
承诺的目的。它需要一个承诺列表,但你给出的是一个承诺值列表

const typecheckArray = await Promise.all(
  evoCfg.cameras.map(camera => {
    if (camera.type === 'H264') {
      return matchCamera(camera);
    } else if (camera.type === 'RTSP') {
      return matchIP(camera);
    } else if (camera.type === 'AUDIO') {
      return matchAudio(camera);
    } else {
      // Motion JPEG
      return Promise.resolve(true);
    }
  })
);

另外,
Promise.all
返回一个值数组。

问题在于您的
matchIP
函数中包含

try {
  // ... code
catch (e) {
  return e;
}
因此,它将错误作为一个值返回,而不是抛出它让外部块捕获


另外,正如其他人指出的那样。在
map
函数中使用
wait
,大部分情况下都会破坏
Promise的价值。将
wait
s取出。

问题在于
matchIP
函数在其中

try {
  // ... code
catch (e) {
  return e;
}
因此,它将错误作为一个值返回,而不是抛出它让外部块捕获


另外,正如其他人指出的那样。在
map
函数中使用
wait
,大部分情况下都会破坏
Promise的价值。取出
wait
s。

您如何处理这三个函数中的错误?如果你发现了错误,但没有重新抛出错误或返回被拒绝的承诺。。。实际上,您正在将其转换为已解决的承诺。“所有函数都返回布尔值或错误。”-您的
匹配*
函数是否返回错误或抛出错误?您如何处理这三个函数中的错误?如果你发现了错误,但没有重新抛出错误或返回被拒绝的承诺。。。实际上,您正在将其转换为已解决的承诺。“所有函数都返回布尔值或错误。”-您的
匹配*
函数是否返回错误或抛出错误?因此,不要
返回e做一个
抛出e
?@shaun根本不要使用
try…catch
,除非你打算在例外情况下做一些有用的事情。只需完全删除它即可。因此,不要
返回e做一个
抛出e
?@shaun根本不要使用
try…catch
,除非你打算在例外情况下做一些有用的事情。把它完全去掉。