如何理解这个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';}());
注意}()
函数调用。