谁能解释一下这段代码中的defered
部分是如何工作的?
(function() {
var getPosition = function (options) {
var deferred = $.Deferred();
navigator.geolocation.getCurrentPosition(
deferred.resolve,
deferred.reject,
options);
return deferred.promise();
};
var lookupCountry = function (position) {
var deferred = $.Deferred();
var latlng = new google.maps.LatLng(
position.coords.latitude,
position.coords.longitude);
var geoCoder = new google.maps.Geocoder();
geoCoder.geocode({ location: latlng }, deferred.resolve);
return deferred.promise();
};
var displayResults = function (results, status) {
$("body").append("<div>").text(results[0].formatted_address);
};
$(function () {
$.when(getPosition())
.pipe(lookupCountry)
.then(displayResults);
});
}());
我对上述代码的工作原理有几个问题..
$(function () {
$.when(getPosition())
.pipe(lookupCountry)
.then(displayResults);
});
- 上面的代码在不传递
options
的情况下如何仍然有效? pipe
方法的作用是什么以及如何将position
传递给lookupCountry() 方法?- 如果在
getPosition
函数中触发deferred.reject
会发生什么?
最佳答案
第一个函数 getPosition
的调用不带参数,但这没关系,因为 HTML5 地理定位 API 不需要选项对象即可工作。
navigator.geolocation.getCurrentPosition()期望成功回调(函数)作为其第一个参数。在本例中,该函数为 deferred.resolve()它接收并将其收到的任何参数传递到链的下一步。由于它接收到有效位置,因此这就是传递给 lookupCountry
的位置。
lookupCountry
将位置转换为 google.maps.LatLng 对象,并将其提供给 google.maps.GeoCoder()反向地理定位调用,也需要一个成功回调函数。在这种情况下,它将地址数组传递到链的下一步。
displayResults
将接收地址对象数组,选择第一个并显示其格式化地址。
上面的代码并不能神奇地工作。每个函数都会在预期位置接收预期参数。如果代码已修改并且需要 lookupCountry
,例如,注释作为第一个参数:
var lookupCountry = function (comment, position) {
...
}
它不再起作用,因为它不能仅仅猜测每个参数的含义。
我不确定以上是否是延迟的良好用例。上面的整个代码可以用
来完成$(function () {
navigator.geolocation.getCurrentPosition(function (position) {
var geoCoder = new google.maps.Geocoder();
geoCoder.geocode({
location: {
lat: position.coords.latitude,
lng: position.coords.longitude
}
}, function (results) {
$("body").append("<div>").text(results[0].formatted_address);
});
});
});
关于javascript - Deferred如何传值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27668060/