如何理解这个Promise代码?

'use strict'; Promise.resolve(() => 'John') .then((args) => { console.log(args); throw new Error('ops') }) .catch((ex) => { console.log(ex) }) .then(() => { throw new Error('ups') console.log('Doe') }) 

我想console.log(args); 应输出'John' ,但是当我运行这个代码,输出是[ [Function] ]

所以我很困惑。

Promise.resolve将创build一个新的Promise,并将其传递给它。 所以,在你的情况下,你的承诺实际上是用函数对象解决的。 这意味着, then处理程序是通过函数对象本身。

你应该做的是

 new Promise((resolve, reject) => resolve('John')) .then(args => { console.log(args); throw new Error('ops') }) .catch(console.log.bind(console)); 

现在,您正在创build一个Promise对象,并使用John的值来解决这个问题。


如果你希望你的Promise被一个值解决,那么不要传递函数对象,而是把实际的值本身传递给Promise.resolve函数。

 Promise.resolve('John') .then(args => { console.log(args); throw new Error('ops') }) .catch(console.log.bind(console)); 

现在,你有一个Promise,用John值解决, then处理程序将得到parsing的值John

注意:当你知道实际的解决方法时,这是build立Promise的推荐方式,以便避免Promise构造函数反模式 。

 'use strict'; Promise.resolve('John') .then((args) => { console.log(args); throw new Error('ops') }) .catch((ex) => { console.log(ex) }) .then(() => { throw new Error('ups') console.log('Doe') }) 

我修改Promise.resolve('John') ,它的工作原理。 请参阅Promise.resolve 。

resolve用于将参数直接传递给then处理程序

如果你想要'约翰',你需要调用你的调用匿名函数resolve()

 Promise.resolve(function(){return 'John';}()); 

注意}()函数调用。