2016-07-14 51 views
0

我正在創建一個小應用程序,其中我有40個小部件,我正在循環和提取數據並重繪它。現在等到最後一個函數完成它的工作然後在angularjs

$scope.loopWiget = function(){ 
    for(var i=0; i < $scope.totalWidget.length; i++) 
    { 
    if($scope.totalWidget[i].widgetType == "chart"){ 
    $scope.fetchData($scope.totalWidget[i]);} 
    if($scope.totalWidget[i].widgetType == "table"){ 
    $scope.fetchDataFortable($scope.totalWidget[i]);} 
    } 

    }; 

    $scope.fetchData = function(id){ 
    // fetching data and in response calling other function 
    $http({ 
     method: 'POST', 
     url: 'rest/dataset/metadata', 
     type: 'json', 
     headers:{'id':id} 
    }).success(function(response){ 

    $scope.drawWid(response); 
     }) 
    }; 
$scope.fetchDataFortable= function(id){ 
    // fetching data and in response calling other function 
    $http({ 
     method: 'POST', 
     url: 'rest/dataset/metaTabledata', 
     type: 'json', 
     headers:{'id':id} 
    }).success(function(response){ 

    $scope.drawWidTable(response); 
     }) 
    }; 
    $scope.drawWid = function(response){ 
     // All draw logic comes here 
    }; 
$scope.drawWidTable= function(response){ 
     // All draw logic comes here 
    }; 

$scope.totalWidget = [{'widgetId':'1','widgetType':'table'},{'widgetId':'2','widgetType':'chart'},{'widgetId':'3','widgetType':'maps'},{'widgetId':'4','widgetType':'chart'}]; 
    $scope.loopWiget(); 

我的循環犯規等待完成drawWid功能和再次呼叫fetchdata由於這個我在1號窗口小部件獲得第二小部件的數據。所以如何等待循環,直到繪製函數完成其代碼,然後調用fetchData函數以用於下一個小部件。

回答

0

由於這是一個異步請求,所以這是常見的渲染數據隨機。有此幾個可能的解決方案:

第一種辦法:將數據存儲從響應一個陣列中,並且當所有的數據已被提取那麼只調用draw函數來逐個呈現小部件,或者將小部件呈現在循環索引處。

widgets.forEach((widget, index) => { 
      return this.myService.getData(widget.entityProp) 
       .then(res => { 
        this.drawWid(res, index); 
       }); 
}); 


    drawWid(res, index) { 
     compute logic accroding to the index of data . 
    } 

第二種方法:您可以使用$ q.all()從所有請求中提取數據,然後進行渲染。

+0

謝謝@sumit,您的回答,您可以建議我用$ q.all()的例子,因爲我不能等到所有的數據來。 – Mayur

+0

嗨Mayur,什麼$ q.all()是不會等到所有的請求已被解決,而與第一種方法,你可以通過索引或ID作爲散列,即 $ scope.fetchData($ scope.totalWidget [i] .widgetId,i);在這裏,我將作爲你的ID工作。現在您可以根據您獲得該ID的數據進行計算。 –

0

你能試試下面的代碼:

var index = 0; 
$scope.loopWiget = function(){ 
    if(!$scope.totalWidget[index]){ 
     return; 
    } 
    var id = $scope.totalWidget[index]['widgetId']; 

    if($scope.totalWidget[index].widgetType == "chart"){ 
     $scope.fetchData(id); 
     } 
     if($scope.totalWidget[index].widgetType == "table"){ 
     $scope.fetchDataFortable(id); 
     } 
}; 

$scope.fetchData = function(id){ 
    $http({ 
      method: 'POST', 
      url: 'rest/dataset/metadata', 
      type: 'json', 
      headers:{'id':id} 
     }).success(function(response){ 
       $scope.drawWid(response); 
       index++; 

     }); 
} 
$scope.drawWid = function(response){ 
    // All draw logic comes here 
    $scope.loopWiget(); 
}; 

$scope.totalWidget = [{'widgetId':'1','widgetType':'table'},{'widgetId':'2','widgetType':'chart'},{'widgetId':'3','widgetType':'maps'},{'widgetId':'4','widgetType':'chart'}]; 
$scope.loopWiget(); 
+0

感謝@browen李你的寶貴時間。我不能改變這種方式,因爲我必須調用一個fetchData函數,因爲我使用這個函數的地方也很多,所以我不能在loopwidget函數中注入$ http。有沒有其他的選擇? – Mayur

+0

@Mayur如你所願,請看我更新的代碼 –

+0

Hi @Bowen Li,當我調用widgetType作爲表和地圖時,它失敗。 有沒有一種方法可以從$ q中實現。任何示例 – Mayur

相關問題