在对象文字中使用jquery.when

时间:2017-12-06 08:05:34

标签: javascript jquery object-literal .when

我有一个名为addLocation的javascript / jQuery函数,它是一个对象文字的方法:

addLocation: function(latLng, address=false, elevation=false, pan=false)
{

    $.when(geographic.getAddress(latLng), geographic.getElevation(latLng), geographic.getMagneticDeclination(latLng))
        .done(function(data){

            if (data.status != 'OK') {
                window.alert(data.message);
            }

            if (pan) {
                flyityourself.map.panTo(latLng);
                flyityourself.map.setZoom(16);
            }

            flyityourself.addWaypoint(latLng, data);

            flyityourself.addMarker(latLng, data);
        })
        .fail(function(msg) {
            window.alert(msg);
        }
    );
},

getAddress,getElevation和getMagneticDeclination这三个函数都是名为' geographic'的第二个对象文字的所有方法。

但是代码失败了。

在调试器中,我检查了所有四个函数。

  • getAddress,getElevation和getMagneticDeclination中的每一个都创建$ .Deferred对象并按原样返回$ .Deferred.promise对象。
  • getAddress,getElevation和getMagneticDeclination中的每一个都在检索正确的数据,并且都到达各自的resolve()语句。
  • 但是在addLocation()中,data参数只包含从getAddress返回的数据。

以前,只有三个方法getAddress,getElevation和getMagneticDeclination都在对象字面“地理位置”中。 addLocation位于一个扁平的.js文件中。在这种情况下,代码有效。

但是,自从更改我的代码以将addLocation放入对象文字后,代码就开始失败了。

$ .when在对象文字方面的工作方式是否有所不同,或者我忘了对某些内容进行限定?

的问候。 克里斯B.

1 个答案:

答案 0 :(得分:0)

一个。沃尔夫在他们的评论中是对的 - 你完成回调需要3个参数,每个承诺由一个时间来处理。

这是一个简单的例子,提供一个模拟地理对象,让你的代码在一个独立的小提琴中工作:

https://jsfiddle.net/tmLrn4gc/1/

// Mock geographic object for testing
geographic = {
  // Return a promise, and a second later, resolve that promise with some
  // dummy data.
  getAddress: function() {
    var dfd = $.Deferred();
    window.setTimeout(function() {
      dfd.resolve("address:lat1,lng1")
    }, 1000);
    return dfd.promise();
  },
  getElevation: function() {
    var dfd = $.Deferred();
    window.setTimeout(function() {
      dfd.resolve("elevation:meters")
    }, 1000);
    return dfd.promise();
  },
  getMagneticDeclination: function() {
    var dfd = $.Deferred();
    window.setTimeout(function() {
      dfd.resolve("declination:degrees")
    }, 1000);
    return dfd.promise();
  }
};

// A simplified location manager, showing the 3 promises and a done method.
// The console output in the fiddle shows the 3 promises are resolved as
// desired.
LocationManager = {
  addLocation: function(latLng, address=false, elevation=false, pan=false) {
    $.when(
      geographic.getAddress(latLng),
      geographic.getElevation(latLng),
      geographic.getMagneticDeclination(latLng)
    ).done(function(d1, d2, d3) {
        console.log("Done", d1, d2, d3);
    })
  }
}

// Make it all happen!
LocationManager.addLocation();