事件:'multipleResolves'


【Event: 'multipleResolves'

稳定性: 0 - 已弃用

  • type <string> 解析类型。可以是 'resolve''reject'
  • promise <Promise> 已解决或拒绝多次的承诺。
  • value <any> 承诺被原始解决后,承诺被解决或拒绝的值。

每当 Promise 出现以下情况时,会触发 'multipleResolves' 事件:

【The 'multipleResolves' event is emitted whenever a Promise has been either:】

  • 已解决不止一次。
  • 多次被拒绝。
  • 解决后被拒绝。
  • 驳回后已解决。

在使用 Promise 构造函数时,这对于跟踪应用中潜在的错误很有用,因为多次解析会被悄无声息地忽略。然而,该事件的发生并不一定表示存在错误。例如,Promise.race() 可能会触发 'multipleResolves' 事件。

【This is useful for tracking potential errors in an application while using the Promise constructor, as multiple resolutions are silently swallowed. However, the occurrence of this event does not necessarily indicate an error. For example, Promise.race() can trigger a 'multipleResolves' event.】

由于在像上面 Promise.race() 示例这样的情况下该事件不可靠,因此已被弃用。

【Because of the unreliability of the event in cases like the Promise.race() example above it has been deprecated.】

import process from 'node:process';

process.on('multipleResolves', (type, promise, reason) => {
  console.error(type, promise, reason);
  setImmediate(() => process.exit(1));
});

async function main() {
  try {
    return await new Promise((resolve, reject) => {
      resolve('First call');
      resolve('Swallowed resolve');
      reject(new Error('Swallowed reject'));
    });
  } catch {
    throw new Error('Failed');
  }
}

main().then(console.log);
// resolve: Promise { 'First call' } 'Swallowed resolve'
// reject: Promise { 'First call' } Error: Swallowed reject
//     at Promise (*)
//     at new Promise (<anonymous>)
//     at main (*)
// First callconst process = require('node:process');

process.on('multipleResolves', (type, promise, reason) => {
  console.error(type, promise, reason);
  setImmediate(() => process.exit(1));
});

async function main() {
  try {
    return await new Promise((resolve, reject) => {
      resolve('First call');
      resolve('Swallowed resolve');
      reject(new Error('Swallowed reject'));
    });
  } catch {
    throw new Error('Failed');
  }
}

main().then(console.log);
// resolve: Promise { 'First call' } 'Swallowed resolve'
// reject: Promise { 'First call' } Error: Swallowed reject
//     at Promise (*)
//     at new Promise (<anonymous>)
//     at main (*)
// First call