javascript - Deferred如何传值?

标签 javascript jquery google-maps-api-3

谁能解释一下这段代码中的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);
});
  1. 上面的代码在不传递 options 的情况下如何仍然有效?
  2. pipe 方法的作用是什么以及如何将position 传递给lookupCountry() 方法?
  3. 如果在 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/

相关文章:

JavaScript 匿名函数行为

javascript - 在包含多个单词的表格中搜索

javascript - 在 PHP 中创建 onchange/oninput 监听器

javascript - 将不同的 JavaScript 对象合并到一个对象中

javascript - 如何找出 jquery 数组对象中的特定字符串?

jquery - jquery 提交评论的逆序列表

android - 无法显示来自存储在 mysql 数据库中的坐标的 google maps android 标记

javascript - 嵌套的 Angular 指令在 `template` 和 `templateUrl` 上表现不同

javascript - 显示45度倾斜,然后立即切换到0度 View ,在某些位置会发生这种情况,为什么?

javascript - 在谷歌地图上拖动标记时有没有办法强制 Dragend 事件