如何理解这个Promise代码?

时间:2016-01-08 01:57:03

标签: javascript node.js promise es6-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] ]

所以我很困惑。

3 个答案:

答案 0 :(得分:4)

Promise.resolve将使用您传递给它的值创建一个新的Promise。因此,在您的情况下,您的承诺实际上是通过函数对象解决的。这意味着,then处理程序将传递给函数对象本身。

你应该做的是

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

现在,您正在创建一个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处理程序将获得已解析的值John

注意:当您知道实际解决方法时,这是建议Promise的推荐方法,这样您就可以避免使用Promise constructor anti-pattern

答案 1 :(得分:3)

'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

答案 2 :(得分:1)

resolve用于将参数直接传递给then-handler

如果你想要'John',你需要在你的调用中调用匿名函数来解析()

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

注意}()函数调用。