【问题标题】:AngularJs scope attributes and promisesAngularJs 范围属性和承诺
【发布时间】:2013-07-04 04:27:23
【问题描述】:

我有这个代码:

var geocode = function(value) {
 var request;
 .....
 var dResult = Q.defer();
 geocoder.geocode(request, function (results) {
   dResult.resolve(results);
 });
 return dResult.promise;
};

var cancelWatch;
$scope.$watch('value', function (value) {
 $timeout.cancel(update);
 update = $timeout(function () {
   $scope.geocodedResult = geocode(value);
 }, 300);
});

在第 15 行 $scope.geocodedResult 是一个承诺,迟早会成为结果值并且范围应该刷新。不幸的是,这并没有发生。 如果我这样做,代码就可以工作

geocode(value).then(function(result) {
 $scope.geocodedResult = result;
 $scope.$digest();
});

我做错了什么?

更新:

我现在尝试只使用 $q 但我无法让它工作:

this.getCurrentPosition = function () {
    var dCurrentPosition = $q.defer();
    if (currentPosition) {
        dCurrentPosition.resolve(currentPosition);
    } else {
        navigator.geolocation.getCurrentPosition(function (cp) {
            currentPosition = cp;
            dCurrentPosition.resolve(currentPosition);
        });
    }
    return dCurrentPosition.promise;
};
this.getCurrentLoc = function () {
    return self.getCurrentPosition().then(function (currentPosition) {
        return [currentPosition.coords.longitude, currentPosition.coords.latitude];
    });
};

一个断点

return [currentPosition.coords.longitude, currentPosition.coords.latitude];

当它与 Q 一起正常工作时永远不会被触发

【问题讨论】:

  • 请将所有相关代码添加到问题中。不必要时远离外部链接。
  • 在工作版本中你没有做错任何事。在非工作版本中,您分配承诺,就好像它是一个结果,但承诺不会那样工作 - 它们不会神奇地转变为他们承诺交付的结果。为了在结果到达时对其进行处理,需要调用 promise 的 .then() 方法,并带有适当的回调。

标签: angularjs promise q


【解决方案1】:

如果你使用 Angular 的 $q 而不是 Q,它应该可以工作:

var dResult = $q.defer();

$q Promise 被模板引擎识别为 Angular,这意味着在模板中,您可以将附加到范围的 Promise 视为结果值。 -- $q docs

所以$scope.geocodedResult可以设置为$q的promise,当promise被解析后,scope属性会自动更新。

【讨论】:

  • 谢谢,尝试迁移到 $q 但无法正常工作(请参阅更新后的问题)
  • @nicco82,根据 getCurrentLoc() 的调用方式,您可能需要调用 $apply(),因为 resolve() 的结果是异步传播的。请参阅stackoverflow.com/a/14762098/215945 了解更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-29
  • 2014-11-06
  • 2014-06-24
  • 1970-01-01
  • 2012-12-27
  • 2023-03-15
相关资源
最近更新 更多