2015-04-07 120 views
2

我有一個承諾,它在應用程序啓動期間運行時沒有問題,例如,但是,如果我嘗試動態運行承諾,假設單擊按鈕時,(1)承諾執行成功,但沒有更新我的變量。AngularJS承諾不起作用

運行的應用或只消化產生以下錯誤:$digest already in progress

$scope.getContent = function() { 
     myPromise 
      .success(function(data) { 
       $scope.myVariable = data; //THIS WORKS 
       console.log(data); //THIS WORKS 
      }) 
    } 
    //Running the below code afterwards still produces a null value 
    console.log($scope.myVariable); 
+0

的NG-點擊放置一個鏈接,

回答

1

這就是我們所說的異步世界。

當你在等待你的承諾的回調時,你已經執行了語句console.log($scope.myVariable);,但你仍然沒有任何價值。

在這種情況下,您可以使用$ watch,如果您想在外面獲取它的值。

$scope.$watch('myVariable',funciton(newVal){ 
console.log(newVal); 
}); 

小細節: -

myPromise被調用,並等待在聲明console.log($scope.myVariable);它執行後,同時響應這顯然doen't有它裏面$ scope.myVariable任何值(沒有人給它:-P)。所以當響應回來時,它調用成功或錯誤方法,並初始化變量$ scope.myVariable的值並打印出來。

0

我覺得承諾對象進行呼叫只有一次,當控制器初始化

你必須重新初始化控制器,以獲得新的更新後的值從服務器

1

這裏您的console.log($scope.myVariable);語句在成功回調之前執行,因此您需要在作用域變量上應用.then()鏈接或應用監視。

1

你的諾言之後的console.log記錄爲null的原因是因爲它在諾言返回之前執行。儘管使用promise的函數已經運行,但代碼的成功部分還沒有被解僱。代碼擊中承諾,進行調用,創建承諾對象,然後繼續前進。當promise返回時,它用返回的數據填充空promise對象。這是發生在您之後

console.log($scope.myVariable); 

處理它的一個好方法是將返回的值存儲在變量中。在成功設置變量爲返回的數據,然後使用一個函數,如

$scope.myVariable = undefined; 
$scope.getContent = function() { 
    myPromise 
     .success(function(data) { 
      $scope.myVariable = data; //THIS WORKS 
      console.log(data); //THIS WORKS 
     }) 
} 
function checker() { 
    if($scope.myVariable) { 
     console.log($scope.myVariable); 
    } 
} 

然後,您可以根據需要調用該函數。

根據你在做什麼以及什麼時候你的getContent函數需要運行,你可能想要在ui-router中使用它,並使用resolve,它會在加載頁面之前運行這些函數,從而確保你有數據到與DOM加載時一起工作。 AngularJS UI-Router: preload $http data before app loads

0

A.當DOM就緒時,調用順序如下: 1. $ scope.getContent將被初始化。 2.然後執行:console.log($ scope.myVariable);

B.異步調用: 1.如果成功,則在下面的語句將被執行。 $ scope.myVariable = data; //此作品

A點和B點以上是獨立的。這裏的執行是asyc。 希望這會幫助你理解。請享用。

0

也許這可以幫助:

// a service providing data with async call 
app.service('myService', function(elasticQuery) { 
    this.getData = function (a,b,c) { 
     // don't forget the 2 return 
     return elasticQuery.search({ 
     // make ajax call 
     }).then(function (response) { 
     return response 
     }); 
    }; 
}); 


// in my controller 
// scope.getData is lunch with ng-click in the view 
$scope.getData = function(a,b,c){ 
    myService.getData(a,b,c).then(function (data) { 
     $scope.myVariable = data;   
    }); 
};