逐步了解工厂错误处理程序
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)();
- 将 testPromise 作为参数
- 我调试了这个和参数内容
是 [] (空),当试图将参数分配给 testPromise =
async(paramName) => ....我无法在该函数中使用它。
它试图传播什么?
- 我假设这被翻译为 testPromise(...上一步的参数)
为什么需要在另一个函数内部调用这个函数链?
在第 (2) 项之后,当尝试将值传递给 paramName 时,它也不会在控制台上打印出来!:
const testPromise = async (paramName) => {
var data = await myPromise;
console.log(data, paramName)
}
const errorHandlerBig = function(fn){...}
errorHandlerBig(testPromise)('RandomValue')
先谢谢大家了!
errorHandlerBig 接受一个函数并将其包装在自己的错误处理中。
从外到内,它:
- 将函数(1) 作为参数。
- 创建并 returns 接受任意数量参数的新函数 (2)。
- 在函数 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>
我正在阅读和学习 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)();
- 将 testPromise 作为参数
- 我调试了这个和参数内容 是 [] (空),当试图将参数分配给 testPromise = async(paramName) => ....我无法在该函数中使用它。 它试图传播什么?
- 我假设这被翻译为 testPromise(...上一步的参数)
为什么需要在另一个函数内部调用这个函数链?
在第 (2) 项之后,当尝试将值传递给 paramName 时,它也不会在控制台上打印出来!:
const testPromise = async (paramName) => {
var data = await myPromise;
console.log(data, paramName)
}
const errorHandlerBig = function(fn){...}
errorHandlerBig(testPromise)('RandomValue')
先谢谢大家了!
errorHandlerBig 接受一个函数并将其包装在自己的错误处理中。 从外到内,它:
- 将函数(1) 作为参数。
- 创建并 returns 接受任意数量参数的新函数 (2)。
- 在函数 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>