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

时间:2017-11-01 20:07:10

标签: javascript jquery ajax 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();
})

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

FROM php:7-fpm
COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint
RUN chmod +x /usr/local/bin/docker-entrypoint
ENTRYPOINT ["docker-entrypoint"]

2 个答案:

答案 0 :(得分:4)

这只是意味着抛出的错误不是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));
}

答案 1 :(得分:0)

  

例如,在我写这篇文章时,我也认为让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>
&#13;
&#13;
&#13;

相关问题