承诺甚至在调用.resolve()之前得到解决

时间:2014-08-30 13:04:06

标签: javascript angularjs angular-promise

我在angularjs

中制作了LocationService
factory('LocationService', function ($q) {
    var deferred = $q.defer();
    var curPos = {};
    var resolved = false;

    return {
        getPosition : function (refresh) {
            if (!resolved || refresh) {
                navigator.geolocation.getCurrentPosition(function (pos) {
                    curPos.curLat = pos.coords.latitude;
                    curPos.curLng = pos.coords.longitude;
                    resolved = true;
                    console.log("Resolve", curPos);
                    deferred.resolve(curPos);
                }, function (error) {
                    deferred.reject('Unable to get location: ' + error.message);
                }, {
                    enableHighAccuracy : true
                });
            } else {
                deferred.resolve(curPos);
            }
            return deferred.promise;
        }
    }
})

并像这样使用

LocationService.getPosition(refresh).then(function (curPos) {
    console.log('then');
    var latLng = new google.maps.LatLng(curPos.curLat, curPos.curLng);
    $scope.map.setCenter(latLng);
    $scope.map.setZoom(15);
});

第一次它工作正常,但是当我点击一个调用getPosition()的按钮时,它甚至会在LocationService触发器deferred.resolve()之前解析。我在回调中得到了错误的结果。但最终在2/3秒后getCurrentPosition触发回调,新值在curPos中设置。我下次会得到的。

控制台首先打印then,然后在2/3秒后打印Resolve

我无法理解这里的错误。有人可以指导一下吗?

1 个答案:

答案 0 :(得分:0)

您的延期获取声明为服务构建的一部分。第一次调用getPosition后,延迟就会得到解决。您需要为每次调用getPosition创建并使用新的延迟。