Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/479.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_Promise_Node Pg Pool - Fatal编程技术网

Javascript 承诺中多次拒绝承诺。那么,到底发生了什么?

Javascript 承诺中多次拒绝承诺。那么,到底发生了什么?,javascript,node.js,promise,node-pg-pool,Javascript,Node.js,Promise,Node Pg Pool,Promise.all([iterable])是all或nothing,意思是当iterable中的每个承诺都解决时,或者当其中一个承诺被拒绝时,它返回的承诺就会解决,原因是第一个承诺被拒绝() 但若iterable的多个承诺被拒绝,会发生什么呢 在VSCode中,我尝试了以下示例,故意使foo()和bar()承诺都失败。当我在VSCode中调试时,我在*catch(err=>Promise.reject('error query bar()')*上得到一个错误,说发生了异常,我不明白为什么 我

Promise.all([iterable])是all或nothing,意思是当iterable中的每个承诺都解决时,或者当其中一个承诺被拒绝时,它返回的承诺就会解决,原因是第一个承诺被拒绝()

但若iterable的多个承诺被拒绝,会发生什么呢

在VSCode中,我尝试了以下示例,故意使foo()和bar()承诺都失败。当我在VSCode中调试时,我在*catch(err=>Promise.reject('error query bar()')*上得到一个错误,说发生了异常,我不明白为什么

我想这是因为当我调用Promise.reject the Promise.all时,已经收到了来自foo函数的拒绝,该函数也失败了,但不清楚发生了什么

如果在调试选项中禁用“未捕获异常”断点,则该异常将不再显示

这里到底发生了什么事?

function foo() {
  return pool.query('insert_test into test (value) values (20)')
    .then(() => client.query('insert into test (value) values (21)'))
    .catch(err => Promise.reject('error query bar()'))
}

function bar() {
  return pool.query('insert_test into test (value) values (20)')
    .then(() => client.query('insert into test (value) values (21)'))
    .catch(err => Promise.reject('error query bar()'))
 }

 Promise.all([foo(), bar()])
   .then(results => {
     console.log(results)
   })
   .catch(err => {
     console.log(err)
   });
这是我在启用未捕获异常时看到的屏幕截图。

但若iterable的多个承诺被拒绝,会发生什么呢

第一次拒绝成功并获得拒绝
承诺的理由。全部
承诺。这里的“第一个”意思是“最早发生”,如果在
承诺时承诺已经被拒绝。所有的
访问它们迭代顺序很重要

随后的拒绝将被忽略

如果在调试选项中禁用“未捕获异常”断点,则该异常将不再显示


真奇怪。被忽略的拒绝不应导致未处理的拒绝(或未捕获的异常)。

@StudyImpits如果要防止在第一个承诺被拒绝后,因此在
承诺被拒绝后,剩余承诺被拒绝的未捕获异常。所有
都被拒绝,to可以尝试Promise的自定义实现。所有这些都像这样包装原始实现(typescript):

const promiseAll=async(promises:Promise[])=>{
让某人拒绝=错误
const onReject=(err:any)=>{
如果(已拒绝){
oneHasRejected=true
返回承诺。拒绝(错误)
}否则{
返回承诺。解决()
}
}
返回Promise.all(promises.map((p)=>p.then((r)=>r,onReject)))
}

您不需要在catch中调用
Promise.reject()
,因为catch是一个Promise函数(请参见此处:)。此外,您不必在
foo()
bar()
中捕捉错误,
Promise中的catch函数。all
处理所有拒绝@noChance我想他这样做是为了区分错误和
foo
错误和
bar
@noChance谢谢你的回答。是的,我想区分巴尔的错误和福的错误。但更重要的是,如果我不调用Promise.reject,它将不会出现在Promise.all catch中,但在then中,对吗?我正在考虑用.catch(err=>Promise.reject())替换.catch(err=>Promise.reject())为.catch(err=>{})@MarcoGalassi No,Promise.all的catch函数将处理所有错误。正如你所说的:承诺。所有([iterable])要么全有,要么一无所获。因此,您可以在foo()或bar()中根据需要将任意多个承诺排队,但任何错误都将由外部Promise.all.catch-function.Yeah处理,在这种情况下,我就可以了。奇怪的是,如果我在没有调试的情况下运行应用程序,它就会工作
  const promiseAll = async (promises: Promise<any>[]) => {
    let oneHasRejected = false
    const onReject = (err: any) => {
      if (oneHasRejected) {
        oneHasRejected = true
        return Promise.reject(err)
      } else {
        return Promise.resolve()
      }
    }
    return Promise.all(promises.map((p) => p.then((r) => r, onReject)))
  }