兑现诺言无拒

时间:2019-07-13 07:53:09

标签: javascript

我正在输入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)

有人可以帮助我理解我在这里缺少的东西吗?

3 个答案:

答案 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,则返回参数本身。

ecma.org

换句话说,这意味着传递给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);

此代码旨在模拟一个表达环境……至少以我们感兴趣的方式。我将reqres定义为2个伪对象,而将next()定义为显示我们的错误(如果有)。 asyncUtil()将启动一个在1秒钟后解析的函数,并显示其结果。

该代码段的首次运行应产生以下结果:

First result : everything went good

注意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");

我们要做的是在函数开始时抛出一个假错误。运行此命令时注意结果:

Error thrown

我们的常规脚本未执行(错误后会中断),我们移至next()函数!

我们的Promise没有任何错误处理程序,但是即使抛出错误,即使在reject()之外,它仍然会传播。在这里,Promise无法解决,因为它已在流程中中断,我们的catch()将能够阻止该异常,从而避免整个代码被关闭。

希望它已经足够清楚了,请随时询问是否有任何无法理解的地方!