承诺问题:ReferenceError:未定义拒绝

时间:2018-07-01 10:05:48

标签: javascript

我正在使用一些自己的内置promise示例来了解此功能的工作原理。

以下代码会产生错误

  

ReferenceError:未定义拒绝

我首先使用节点Promise.js并使用8.11.3版的节点

这是我的代码,产生错误的部分注释为“问题

function testPromise () {

//part 1
  function checkCountOnServer () {
    return new Promise(function (resolve, reject) {
      var available = false
      if (available) {
        resolve('available')
      }
      else {
        reject('not available')
      }
    })
  }

  function checkPayment () {
    return new Promise(function (resolve, reject) {
      var booleanTest = true
      if (booleanTest) {
        resolve('payment done')
      }
      else {
        reject('no payment received')
      }
    })
  }

  var checkCountOnServerVar = checkCountOnServer()
  checkCountOnServerVar.then(function (resolve) {
    console.log(resolve)
    return resolve(checkPayment())
  }, function (reason) {
    console.log(reason) //works
    reject(reason) // problem
  }).then(function (value) { console.log(value) },
    function (rejected) {
      console.log(rejected) //problem
    })

}

testPromise()

我实际上希望消息“不可用”两次。

即使我将拒绝(原因)更改为拒绝(“测试”),我也会遇到相同的错误。

请帮助我。

1 个答案:

答案 0 :(得分:3)

 checkCountOnServerVar.then(function (resolve) {

then回调函数以承诺被解析为的任何值(在您的情况下为"payment done")调用,这不是一个函数,因此您无法调用它。要从then处理程序内部链接一个Promise,只需将其返回:

checkCountOnServerVar.then(function (status) {
 console.log(status);
 return checkPayment();
})

另外,您的错误捕获程序根本没有任何意义,

function (reason) {
  console.log(reason) //works
  reject(reason) // problem
}

未定义reject,并且您实际上不处理该错误。如果不处理该错误,则附加一个处理程序是没有意义的,否则应return该链可以继续使用的值,例如:

function(error) {
  console.error("Something bad happened", error);
  return "An error occured, but we don't mind...";
}

总结:

checkCountOnServer()
  .then(serverCount => checkPayment())
  .then(payment => console.log(payment))
  .catch(error => console.error(error));