web-dev-qa-db-fra.com

Promesse rejetée avec avertissement sans erreur

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

Pas tout à fait sûr de savoir pourquoi, j'aimerais bien aider à comprendre l'erreur et sa cause. J'apprends toujours les promesses et AJAX alors l'aide est grandement appréciée! (Par exemple, alors que j'écris ceci, je pense aussi qu'il est un peu redondant d'avoir une promesse qui enveloppe un objet ajax, mais honnêtement, je ne sais pas comment le réécrire autrement)

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

Le message d'avertissement UPDATE persiste lorsque j'ai le .fail comme:

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

Cela signifie simplement que l'erreur renvoyée n'est pas un instanceof Error. Par exemple, ce qui suit n’est pas une erreur, mais je peux le jeter parce que ... eh bien ... vous pouvez tout jeter en JavaScript.

throw 42;

Ce qui nous donne un uncaught exception: 42 merveilleux.

Pour renvoyer un actual error, utilisez un Error:

throw new Error('An actual error');

Maintenant, dans votre cas spécifique, vous devez transmettre l'erreur fournie par jQuery, qui n'est pas le premier argument transmis. Il vous donne une chaîne, alors enveloppez-le dans une erreur ...

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

Par exemple, alors que j'écris ceci, je pense aussi que c'est un peu redondant d'avoir une promesse qui enveloppe un objet ajax, mais honnêtement, je ne sais pas comment le réécrire sinon

Vous pouvez définir une fonction qui renvoie l'objet AJAX, ce qui est indiqué dans jQuery docs , renvoie un objet utilisant l'interface Promise JavaScript.

Les objets jqXHR retournés par $ .ajax () à partir de jQuery 1.5 implémentent l'interface Promise en leur donnant toutes les propriétés, méthodes et comportements d'une promesse (voir Objet différé pour plus d'informations).

Voici un exemple de code montrant comment implémenter une telle fonction. J'utilise le Random User API par exemple data.

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>

0
Dominic Serrano