【问题标题】:Promise rejected with non-error warningPromise 被拒绝并带有非错误警告
【发布时间】:2018-04-14 05:49:13
【问题描述】:

错误: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();
})

当我将.fail 设为:

时,更新警告消息仍然存在
.fail(function(jqXHR, textStatus, errorThrown) {
  reject(new Error(errorThrown))
})

【问题讨论】:

  • 做console.log(error);错误是说错误不是错误类型的对象
  • 你得到一个字符串,但最好创建一个Error 对象。所以在你的拒绝函数中做reject(new Error(error))。除了错误实际上是什么之外,这是一个额外的问题。优点:堆栈跟踪将在 Error 对象上可用。
  • 谢谢,但由于某种原因它没有解决我的问题,请参阅更新
  • 在 Chrome 中抛出这个的扩展是 Honey,我刚刚卸载了它。如果你是作者,我希望你尽快修复它。

标签: javascript jquery ajax promise deferred


【解决方案1】:

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

throw 42;

这给了我们一个很棒的uncaught exception: 42

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

throw new Error('An actual error');

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

.fail(function(jqXHR, textStatus, errorThrown ) {
  reject(new Error(errorThrown));
}

【讨论】:

  • 我将代码设为:.fail(function(jqXHR, textStatus, errorThrown) { reject(new Error(errorThrown)) }),但仍然出现错误。我也有点困惑......如果 errorThrown 来自 ajax 本身,它不应该已经为我格式化为错误对象吗?
【解决方案2】:

例如,当我写这篇文章时,我也认为让 Promise 包装一个 ajax 对象有点多余,但老实说,我不知道如何重写它

您可以定义一个返回 AJAX 对象的函数,如 jQuery docs 中所述,返回一个使用 JavaScript Promise 接口的对象。

从 jQuery 1.5 开始,由 $.ajax() 返回的 jqXHR 对象实现了 Promise 接口,为它们提供了 Promise 的所有属性、方法和行为(有关更多信息,请参阅 Deferred 对象)。

这是一个如何实现这样一个功能的代码示例。我正在使用Random User API 作为示例数据。

function getRandomUser() {
  return $.ajax({
    url: 'https://randomuser.me/api/',
    dataType: 'json'
  })
  .fail(error => console.error(error));
}

// getRandomUser's return value is a Promise like object, which we can chain onto
getRandomUser()
.then(
  function(random_user) {
    console.log("success with value = ", random_user)
  },
  function(error) {
    console.log("error with value = ", error)
  }
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

【讨论】:

    猜你喜欢
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2013-09-17
    • 1970-01-01
    • 2019-04-08
    • 2017-02-05
    相关资源
    最近更新 更多