web-dev-qa-db-ja.com

PromiseとAJAXの違いは何ですか?

PromiseとAJAX呼び出しは両方とも非同期操作です。 GET/POST要求は両方で行うことができます。 <<編集:それは間違ったステートメントです

それで、それらの違いは何ですか?そして、いつ他の代わりに一方を使用するのが最善でしょうか?

また、もう1つ:

最近、私はその本体にAJAXがある約束に出会いました。非同期操作を非同期操作の中に入れるのはなぜですか?それは、パンのサンドイッチにパンを入れるようなものです。

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

ここではjQueryが使用されます。 AJAX呼び出しには、Promiseの動作とプロパティがあります。私はそれを早く得ませんでしたが、ここに私の考えがあります:私たちは約束で何かをすることができます。次に、AJAX呼び出しを使用し、done関数で解決済みのPromiseロジックを渡します。特にこの例では何もありません。

今、私は両方を混同していたことがわかります。それらは、ほぼ2つの異なるものです。非同期だからといって、互換性があるわけではありません。

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

EDIT 2:有用だとわかったいくつかの資料

アンチパターンの約束

22
Bruno

約束とAjax呼び出しについて混乱しています。リンゴとナイフのようなものです。ナイフでAppleをカットできます。ナイフはAppleに適用できるツールですが、この2つは非常に異なるものです。

Promiseは、非同期操作を管理するためのツールです。非同期操作が完了するタイミングと結果を追跡し、その完了とそれらの結果(エラー状態を含む)を他のコードまたは他の非同期操作と調整できます。実際には、非同期操作ではありません。 Ajax呼び出しは、従来のコールバックインターフェースで使用したり、Promiseインターフェースにラップしたりできる特定の非同期操作です。

それで、それらの違いは何ですか?そして、いつ他の代わりに一方を使用するのが最善でしょうか?

Ajax呼び出しは、特定の種類の非同期操作です。 XMLHttpRequest interface を使用して従来のコールバックでAjax呼び出しを行うか、 fetch()インターフェイス

最近、本体にAJAXを含む約束がありました。なぜ非同期操作を非同期操作の中に入れるのですか?それは、パンの塊をパンのサンドイッチに入れるようなものです。

話している特定のコードは表示しませんでしたが、非同期操作1を開始し、その非同期操作が完了したら、非同期操作2を開始することがよくあります(多くの場合、最初の結果を使用します)。その場合、通常、一方を他方の内側にネストします。


ここにあなたのコード例:

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

約束のアンチパターンと見なされます。 $.getJSON()は既に返せる約束を既に返しているため、ここで新しい約束を作成する理由はありません。代わりにこれを行うことができます:

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

または、やや非標準のjQuery Promiseを標準Promiseに「キャスト」したい場合は、これを行うことができます。

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