promise甚至在调用.resolve()之前就得到了解决

promise getting resolved even before .resolve() is called

本文关键字:解决 调用 resolve promise      更新时间:2023-09-26

我在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

我不明白这里出了什么问题。有人能指导一下吗?

您的递延get被声明为服务构建的一部分。一旦您对getPosition的第一次调用完成,延迟的问题就会得到解决。您需要为每次对getPosition的调用创建并使用一个新的deferred。