在对象字面量中使用 jquery.when
Using jquery.when in an object literal
我有一个名为 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 对象和 return $.Deferred.promise 对象。
- getAddress、getElevation 和 getMagneticDeclination 中的每一个都在检索正确的数据,并且都在达到各自的 resolve() 语句。
- 但在 addLocation() 中,data 参数仅包含从 getAddress returned 的数据。
以前,对象字面量中只有 getAddress、getElevation 和 getMagneticDeclination 这三个方法 'geographic'。 addLocation 在一个平面 .js 文件中。在这种情况下,代码有效。
但是自从更改我的代码以将 addLocation 放入对象文字后,代码开始失败。
$.when 在对象字面量中的工作方式不同还是我忘记限定某些内容?
问候。
克里斯 B.
一个。 Wolff 在他们所做的评论中是正确的 - 在完成的回调中你需要 3 个参数,一个用于 when 处理的每个承诺。
这是一个简单的示例,提供模拟地理对象以使您的代码在独立环境中工作fiddle:
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();
我有一个名为 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 对象和 return $.Deferred.promise 对象。
- getAddress、getElevation 和 getMagneticDeclination 中的每一个都在检索正确的数据,并且都在达到各自的 resolve() 语句。
- 但在 addLocation() 中,data 参数仅包含从 getAddress returned 的数据。
以前,对象字面量中只有 getAddress、getElevation 和 getMagneticDeclination 这三个方法 'geographic'。 addLocation 在一个平面 .js 文件中。在这种情况下,代码有效。
但是自从更改我的代码以将 addLocation 放入对象文字后,代码开始失败。
$.when 在对象字面量中的工作方式不同还是我忘记限定某些内容?
问候。 克里斯 B.
一个。 Wolff 在他们所做的评论中是正确的 - 在完成的回调中你需要 3 个参数,一个用于 when 处理的每个承诺。
这是一个简单的示例,提供模拟地理对象以使您的代码在独立环境中工作fiddle:
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();