逐步了解工厂错误处理程序

Understanding factory error handler step-by-step

我正在阅读和学习 promises/async/await。 我有点卡住了,试图逐步理解我已经见过几次的错误处理方法,它是一种在创建承诺时处理错误的工厂函数方法。

带注释的代码(下面的问题)


const myPromise = new Promise((resolve, reject)=> 
  setTimeout(()=> console.log('ERROR MESSAGE'),1000))

// async / await with error handler factory

 const testPromise = async () => {
     var data = await myPromise;
     console.log(data) 
}

// this is where i get stuck

const errorHandlerBig = function(fn){   // (1) 
  return function(...parameters) { // (2)
    return fn(...parameters).catch(function(err){ // (3) 
      console.error('Caught in Example 3:', err)
    })
  }
} 

errorHandlerBig(testPromise)(); 

  1. 将 testPromise 作为参数
  2. 我调试了这个和参数内容 是 [] (空),当试图将参数分配给 testPromise = async(paramName) => ....我无法在该函数中使用它。 它试图传播什么?
  3. 我假设这被翻译为 testPromise(...上一步的参数)

为什么需要在另一个函数内部调用这个函数链?

在第 (2) 项之后,当尝试将值传递给 paramName 时,它​​也不会在控制台上打印出来!:

const testPromise = async (paramName) => {
     var data = await myPromise;
     console.log(data, paramName) 
}
const errorHandlerBig = function(fn){...}

errorHandlerBig(testPromise)('RandomValue')

先谢谢大家了!

errorHandlerBig 接受一个函数并将其包装在自己的错误处理中。 从外到内,它:

  1. 将函数(1) 作为参数。
  2. 创建并 returns 接受任意数量参数的新函数 (2)。
  3. 在函数 2 中,使用传递给函数 2 的参数调用函数 1,并尝试捕获生成的任何错误。

由于 errorHandlerBig 将参数传递给 fn,如果您希望参数出现在控制台中,则需要 testPromise 接受参数并记录它们。或者您可以将它们作为错误抛出到 testPromise 中。

如所写,这不是很有用,但如果您需要通过将 errorHandlerBig 返回的函数保存在一个变量中并调用它来多次创建相同的异步进程 运行,它可能会很有用使用不同的参数,或者如果您想对多个异步进程使用相同的错误处理行为。

const throwThings = async (throwWhat) => {
  throw new Error(throwWhat);
}

const happyFunTimes = async (activity) => {
  console.log("I'm having fun");
  await setTimeout(() => console.log(`jumping on a ${activity}`), 1000);
}

const errorHandlerBig = function(fn){   // (1) 
  return function(...parameters) { // (2)
    return fn(...parameters).catch(function(err){ // (3) 
      console.error('Caught in Example 3:', err.toString())
    });
  }
} 

document.getElementById(":)").addEventListener("click", () => errorHandlerBig(happyFunTimes)("bananas"));
document.getElementById(">:(").addEventListener("click", () => errorHandlerBig(throwThings)("bananas"));
<button id=":)">Fun times</button>
<button id=">:(">Throw</button>