Soru ES6 Promises ile jQuery ajax


Bir ES6 sözünü kullanarak jQuery aracılığıyla bir posta isteği yapmaya çalışıyorum:

Benim bir fonksiyonum var:

getPostPromise(something, anotherthing) {
  return new Promise(function(resolve, reject) {
    $.ajax({
      url: someURL,
      type: 'post',
      contentType: 'application/json; charset=utf-8',
      data: JSON.stringify(
        something: something,
        anotherthing: anotherthing
      }),
      dataType: 'json',
      success: resolve,
      error: reject
    });
  });
}

ve ben öyle diyoruz:

getPostPromise(
  'someFooStuff',
  'someBarStuff'
).then(
  function(returnedData) {
    console.log("Good: ", returnedData);
  },
  function(responseObject) {
    console.log("Bad: ", responseObject);
  }
).catch(
  function(errorThrown) {
    console.log("Exception: ", errorThrown);
  }
);

Sunucum, JSON biçimindeki istek gövdesiyle beklendiği gibi bir yanıt veriyor ancak konsol çıktısı:

İyi: undefined

Neden iade edilen verileri alamıyorum?

Herhangi bir yardım için herkese / herkese teşekkürler.

--- GÜNCELLEME DÜZENLE ---

J'leri sadece düşürdüm:

import $ from 'jquery';
$.get('http://localhost:8008/api/user')
  .done(function(data) {
    console.log(data);
  });

Hala çıkış olarak tanımlanmamışım. Şebeke sekmesindeki talebi açarsam, yanıt nesnesini doğru verilerle görebilirim. İstek yapıldı, sunucum mutlu ve yanıt veriyor ve sonuçlar tarayıcımda ancak yapılan data parametresi tanımlanmamış. Ben güldüm.

--- GÜNCELLEME 2 - ÇÖZÜM KURULU ---

Sorunun aşağıdakileri kullanarak olduğunu keşfettim: https://github.com/jpillora/xdomain CORS almak için. Kütüphane, bir şekilde değerleri geri almayı başarır. Onu kaldırdım ve CORS'i düzgün bir şekilde uygulayacak ve desteklemeyen tarayıcılarla cehenneme yarayacak.


21
2018-02-01 16:12


Menşei


Hatanızı yeniden oluşturamıyorum. - Michał Perłakowski


Cevaplar:


jQuery Ajax yöntemleri, kendileri vaat ediyor gerek hepsini sarmak için.

Ancak, elbette, ES6 promise API'siyle tutarlılık için bunu yapabilirsiniz.

GÜNCELLEŞTİRME jQuery 3.0+ uygular Söz / A + APIArtık modern jQuery'de bir şey sarmak için bir sebep yok. Üzerinde okumak jQuery'nin 3.0 sürümünden önceki vaatlerinin özellikleri.

3.0'dan önceki jQuery sürümleri için, bunu yaptığınızdan daha fazla ayırırdım:

function ajax(options) {
  return new Promise(function (resolve, reject) {
    $.ajax(options).done(resolve).fail(reject);
  });
}

ve

ajax({
  url: someURL,
  type: 'post',
  contentType: 'application/json; charset=utf-8',
  data: JSON.stringify({
    something: something,
    anotherthing: anotherthing
  })
}).then(
  function fulfillHandler(data) {
    // ...
  },
  function rejectHandler(jqXHR, textStatus, errorThrown) {
    // ...
  }
).catch(function errorHandler(error) {
  // ...
});

28
2018-02-01 16:31



Snippet'inizi test ettiniz mi? - elad.chen
@ elad.chen Eğer başıboş demek istiyorsan } bir sözdizimi hatasına neden oluyor, bu düzeltildi, teşekkürler. - Tomalak
Bunu beğendim, işten eve döndüğümde test edeceğim ve doğru olduğunu onayladıktan sonra kabul edildiği şekilde işaretleyeceğim. Teşekkürler. - Chad Befus
@Chad Okay. Lütfen probleminizi yeniden üreten bir jsFiddle kurun, ona bakacağım. - Tomalak
@Chad Böyle bir şey düşünüyordum. Gerçekten istiyorsan bakabilirsin XDomainRequest IE8 / IE9 desteği için. Uzatmak nispeten kolay olmalı ajax() Bu veya jQuery'yi kullanmak için yukarıdaki işlev. - Tomalak