我正在输入express-async-handler代码
b
在这里,他们使用.catch而不拒绝承诺,并且在不使用promise构造函数(const asyncUtil = fn =>
function asyncUtilWrap(...args) {
const fnReturn = fn(...args)
const next = args[args.length-1]
return Promise.resolve(fnReturn).catch(next)
}
module.exports = asyncUtil
)的情况下创建了promise
我们使用上述代码段
new Promise(resolve, reject)
有人可以帮助我理解我在这里缺少的东西吗?
答案 0 :(得分:2)
fnReturn
可能是一个承诺,这意味着用Promise.resolve
创建的承诺将接受它。采纳的承诺可能会引发需要捕获的错误
答案 1 :(得分:0)
const fnReturn = fn(... args)
这里,fn可能正在返回一个承诺,该承诺将作为参数传递给Promise.resolve,并且每次下面的代码都将返回一个已解决的承诺,即使fnReturn抛出错误并且在该catch块中也可能无法拒绝执行。>
Promise.resolve或Promise.reject之外的另一种方法是返回resolvePromise值或拒绝的诺言值。
请在下面的代码段中查找以更好地理解它。
let a = Promise.resolve(13);
a.then((value)=>{console.log(value)});
更多要添加到此foo.findAll()返回一个promise,我们将基于最新的ES6功能使用async await来消耗它,如果您不介意在try块下消耗await,以便在遇到任何错误时然后可以在catch块中捕获它。
try{
const bar = await foo.findAll()
}
catch(exception){
console.log(exception);
}
答案 2 :(得分:0)
在不使用promise构造函数的情况下创建了一个promise
我在先前的回答中看到了一个错误: fnReturn本身不一定是一个承诺。它甚至与它无关。根据文档中的说明:
resolve函数返回使用传递的参数解析的新promise,或者如果参数是此构造函数产生的promise,则返回参数本身。
换句话说,这意味着传递给Promise.resolve()
的参数可以是同步函数,它将包装在新的Promise中。这样就可以回答您的第一个问题:他们不必使用Promise构造函数,因为它们不必这样做,而javascript就是为他们做的(就像在try{…} catch{…}
函数中一样)。
这里他们使用了.catch而不拒绝承诺
在尝试找出某些东西时,有趣的是尝试一下代码。让我们看一下以下代码段:
// Original code
const asyncUtil = fn =>
function asyncUtilWrap(...args) {
const fnReturn = fn(...args);
const next = args[args.length-1];
return Promise.resolve(fnReturn).catch(next);
};
// Simulation
const req = {
url: "random"
};
const res = {
html: "rendered"
};
function next(err) {
alert(err.message);
return
}
asyncUtil(async (req, res, next) => {
// throw new Error("An error occured here");
const result = await new Promise(resolve => {
setTimeout(() => {resolve("Result of async function")}, 1000);
});
alert(result);
})(req, res, next);
此代码旨在模拟一个表达环境……至少以我们感兴趣的方式。我将req
和res
定义为2个伪对象,而将next()
定义为显示我们的错误(如果有)。 asyncUtil()
将启动一个在1秒钟后解析的函数,并显示其结果。
该代码段的首次运行应产生以下结果:
注意3条注释行。在这里,一切正常,我们显示了结果。那么这里到底发生了什么。
const fnReturn = fn(...args);
这行将异步功能分配给fnReturn(fnReturn = async (req, res, next) => {. . .}
)。因此,当我们调用Promise.resolve(fnReturn)
时,实际上是将其包装在Promise中,如下所示:
new Promise(resolve => {
resolve(fnReturn);
});
完成后,它将异步将fnReturn
的结果返回给回调。
现在,我们的承诺只能解决,这意味着它本身没有拒绝。但这并不意味着不会发生错误。如果您尝试取消注释以下行:
throw new Error("An error occured here");
我们要做的是在函数开始时抛出一个假错误。运行此命令时注意结果:
我们的常规脚本未执行(错误后会中断),我们移至next()
函数!
我们的Promise没有任何错误处理程序,但是即使抛出错误,即使在reject()
之外,它仍然会传播。在这里,Promise无法解决,因为它已在流程中中断,我们的catch()
将能够阻止该异常,从而避免整个代码被关闭。
希望它已经足够清楚了,请随时询问是否有任何无法理解的地方!