web-dev-qa-db-fra.com

Quelle est la différence entre Promise et AJAX?

Les deux promesses et AJAX sont des opérations asynchrones. Une demande GET/POST peut être effectuée avec les deux. << Edit: c'est une instruction WRONG

Alors, quelle est la différence entre eux? Et quand serait-il préférable d'utiliser l'un au lieu de l'autre?

Et encore une chose:

Récemment, j'ai rencontré une promesse qui avait un AJAX dans son corps. Pourquoi mettre une opération asynchrone dans une opération asynchrone? C'est comme mettre une miche de pain dans un sandwich au pain.

function threadsGet() {
return new Promise((resolve, reject) => {
  $.getJSON('api/threads')
    .done(resolve)
    .fail(reject);
    })
}

jQuery est utilisé ici. Et l'appel AJAX a le comportement et les propriétés de Promise. Je ne l'ai pas obtenu plus tôt mais voici mes réflexions: nous pouvons faire quelque chose dans la promesse. Ensuite, utilisez le AJAX appelez et dans la fonction done passez la logique Promise résolue. Plus précisément dans cet exemple, il n'y en a pas.

Maintenant, je vois que j'avais confondu les deux. Ce sont à peu près 2 choses différentes. Ce n'est pas parce qu'ils sont asynchrones qu'ils sont interchangeables.

==============

EDIT 2: Juste quelques documents que j'ai trouvé utiles:

Promise Anti-Patterns

22
Bruno

Vous êtes confus au sujet des promesses et des appels Ajax. Ils sont un peu comme des pommes et des couteaux. Vous pouvez couper un Apple avec un couteau et le couteau est un outil qui peut être appliqué à une pomme, mais les deux sont des choses très différentes.

Les promesses sont un outil de gestion des opérations asynchrones. Ils gardent une trace de la fin des opérations asynchrones et de leurs résultats et vous permettent de coordonner cette exécution et ces résultats (y compris les conditions d'erreur) avec un autre code ou d'autres opérations asynchrones. Ce ne sont pas des opérations asynchrones en soi. Un appel Ajax est une opération asynchrone spécifique qui peut être utilisée avec une interface de rappel traditionnelle ou enveloppée dans une interface de promesse.

Alors, quelle est la différence entre eux? Et quand serait-il préférable d'utiliser l'un au lieu de l'autre?

Un appel Ajax est un type spécifique d'opération asynchrone. Vous pouvez faire un appel Ajax avec un rappel traditionnel en utilisant XMLHttpRequest interface ou vous pouvez faire un appel Ajax (dans les navigateurs modernes), en utilisant une promesse avec le fetch() interface .

Récemment, j'ai rencontré une promesse qui avait un AJAX dans son corps. Pourquoi mettre une opération asynchrone dans une opération asynchrone? C'est comme mettre une miche de pain dans un sandwich au pain.

Vous n'avez pas montré le code spécifique dont vous parliez, mais parfois vous voulez démarrer l'opération asynchrone 1, puis lorsque cette opération asynchrone est terminée, vous voulez qu'ils démarrent l'opération asynchrone 2 (en utilisant souvent les résultats de la première). Dans ce cas, vous emboîterez généralement l'un dans l'autre.


Votre exemple de code ici:

function threadsGet() {
    return new Promise((resolve, reject) => {
      $.getJSON('api/threads')
        .done(resolve)
        .fail(reject);
      })
}

est considéré comme une promesse anti-modèle. Il n'y a aucune raison de créer une nouvelle promesse ici car $.getJSON() renvoie déjà une promesse que vous pouvez retourner. Vous pouvez simplement le faire à la place:

function threadsGet() {
    return $.getJSON('api/threads');
}

Ou, si vous souhaitez "transtyper" la promesse jQuery quelque peu non standard en promesse standard, vous pouvez le faire:

function threadsGet() {
    return Promise.resolve($.getJSON('api/threads'));
}
58
jfriend00