promise` .then`方法延迟$ scope更新

时间:2017-01-04 15:40:56

标签: angularjs ionic-framework angular-promise

我正在使用angularJS,我这样做:

xxx.then(function (response) {
    $scope.x = response.x;
    $scope.y = response.y;
}, function (error) {}
);

响应来自服务器不是即时的。然后当响应来的时候,我希望比范围更新我的值,但是只有当我点击其他按钮时才这样做。

在我的html中,我收到了这样的信息:

<p>{{x}}</p>
<p>{{y}}</p>

你知道我做错了吗?

2 个答案:

答案 0 :(得分:1)

这可能是摘要周期的问题,请尝试执行以下$scope.$apply()

    xxx.then(function (response) {
     $scope.x = response.x;
     $scope.y = response.y;
     $scope.$apply();
    }, function (error) {});
  

在AngularJS中,传播了承诺解析的结果   异步,在$ digest周期内。所以,回调注册了   只有在进入$ digest循环时才会调用then()。

您的承诺的结果将不会传播到下一个摘要周期。由于您的代码中没有任何其他内容可以触发摘要周期,因此不会立即应用更改。但是,当您单击某个按钮时,它会触发摘要周期,由此会应用更改

检查this以获得有关此问题的明确说明。

答案 1 :(得分:0)

如果承诺来自$ q服务以外的来源,则.then方法可能无法更新DOM。使用$q.when将外部承诺转换为$ q服务承诺:

//xxx.then(function (response) {
$q.when(xxx).then(function (data) {
    $scope.x = data.x;
    $scope.y = data.y;
}, function (error) {
    throw error;
});

$ q服务与AngularJS框架集成,$ q服务.then方法将自动调用框架摘要周期来更新DOM。

  

$ q.when

     

将可能是值的对象或(第三方)随后的承诺包含到$q承诺中。当您处理可能会或可能不是承诺的对象,或者承诺来自不可信任的源时,这非常有用。

- AngularJS $q Service API Reference - $q.when