承诺因非错误警告而被拒绝

jam*_*mes 8 javascript ajax jquery promise deferred

错误: h1.js:25 Warning: a promise was rejected with a non-error: [object String]

不完全确定为什么,爱会帮助理解错误以及导致它的原因.仍然学习Promises和AJAX非常感谢!(例如,当我写这篇文章时,我也认为让Promise包装一个ajax对象有点多余,但老实说我不知道​​如何重新编写它)

var logisticsModule = (function() {
  return {
    initialize: function() {
      dateTimeFxns.getReservedDates.then(
        // success
        function(reserved_dates) {
          console.log("success with value = " + reserved_dates)
        },
        function(error) {
          console.log("error with value = " + error)
        }
      )
    }
  }
})();

var dateTimeFxns = {
  getReservedDates: new Promise( function(resolve, reject) {
    $.ajax({ 
      // some url & data
    })
    .done(function(result) {
      resolve(result)
    }
    .fail(function(error) {
      reject(error)
    }
  })
}

$(document).ready(function() {
  logisticsModule.initialize();
})
Run Code Online (Sandbox Code Playgroud)

当我有.failas 时,UPDATE警告消息仍然存在:

.fail(function(jqXHR, textStatus, errorThrown) {
  reject(new Error(errorThrown))
})
Run Code Online (Sandbox Code Playgroud)

Fen*_*ton 11

这只是意味着抛出的错误不是instanceof Error. 例如,以下不是错误,但我可以抛出它,因为......好吧......你可以在 JavaScript 中抛出任何东西。

throw 42;
Run Code Online (Sandbox Code Playgroud)

这给了我们一个美妙的uncaught exception: 42

要抛出实际错误,请使用Error

throw new Error('An actual error');
Run Code Online (Sandbox Code Playgroud)

现在在您的特定情况下,您需要传递 jQuery 提供的错误,这不是它传递的第一个参数。它给你一个字符串,所以把它包装在一个错误中......

.fail(function(jqXHR, textStatus, errorThrown ) {
  reject(new Error(errorThrown));
}
Run Code Online (Sandbox Code Playgroud)