使用jQuery.Deferred()重写ES6 Promises

时间:2018-01-30 21:33:27

标签: javascript jquery promise ecmascript-5 geo

我目前正在为浏览器编写代码并限制使用ES5。我有权访问jQuery,我需要重写几个当前使用ES6承诺的大型函数。例如:

  function getLocationFromIp() {
    return new Promise(function (resolve, reject) {
      $.ajax({
        url: someUrl,
        data: {},
        xhrFields: {
        withCredentials: true
        },
        success: function (data) {
          resolve(data);
        },
        error: function (err) {
          reject(err);
        }
      });
    }).then(transformIpGeoDataToLocation);
  }

我了解我可以访问.resolve().reject(),但我正在努力实施。它看起来像这样吗?

 function getLocationFromIp() {
   return $.Deferred(function (dfr) {
     $.ajax({
       url: someUrl,
       data: {},
       xhrFields: {
         withCredentials: true
       },
       success: function (data) {
        dfr.resolve(data);
       },
       error: function (err) {
         dfr.reject(err);
       }
     });
   }).promise().then(transformIpGeoDataToLocation);
 }

我也将蓝鸟看作是一个后备,但是我想给这个方法一个机会,谢谢!不幸的是,Babel和其他编译器不是一种选择。

2 个答案:

答案 0 :(得分:3)

所以,如果你不想使用ES6 promises并且想要使用jQuery promises,函数调用$.ajax()已经返回一个jQuery promise,所以不需要将它包装在另一个promise中。您可以直接返回$.ajax()已经返回的承诺:

  function getLocationFromIp() {
      return $.ajax({
        url: someUrl,
        data: {},
        xhrFields: {
        withCredentials: true
      }).then(transformIpGeoDataToLocation);
  }

注意:在3.x之前的jQuery版本中,jQuery承诺(特别是来自Ajax调用)不会解析与ES6承诺完全相同的数据类型。特别是jQuery Ajax承诺解析有三个参数(不是ES6标准的一个)。第一个参数是人们通常使用的结果。您可以使用它,但需要确保.then()transformIpGeoDataToLocation处理程序知道这一点。

答案 1 :(得分:0)

jQuery ajax返回一个promise对象,从1.8开始,你可以通过.then访问它来查看此处的引用:http://api.jquery.com/jquery.ajax/

我包含一些/有点过剩以显示它可能如何工作。

function getLocationFromIp() {
  return $.ajax({
      url: someUrl,
      data: {},
      xhrFields: {
        withCredentials: true
      }          
    })
    .done(function(data, textStatus, jqXHR) {
      alert("success");
    })
    .fail(function(jqXHR, textStatus, errorThrown) {
      alert("error");
    })
    .always(function(data | jqXHR, textStatus, jqXHR | errorThrown) {
      alert("complete");
    })
     // combines done/fail, see reference page
    .then(transformIpGeoDataToLocation // gets passed data, textStatus, jqXHR 
      ,
      function(jqXHR, textStatus, errorThrown) {})// fail in then
}

getLocationFromIp().then(somefunctiontocall);