2017-12-02 154 views
0

目前,我在等待我的承諾傳遞給解決方案時遇到問題。 據我所知,這是因爲它是一個異步調用,所以決心不會等待所有的承諾,只是傳遞我的部分數據來解決。Angularjs ui-router解決方案不會等待所有承諾

我試過尋找很多的論壇,但我似乎無法得到它的工作。

所以這裏是我的主頁。

angular.module('app') 
    .component('home', { 
     templateUrl: 'Content/app/components/home.html', 
     bindings: {}, 
     controller: ['$http', '$state', 'test', 
      function ($http, $state, test) { 
       var vm = this; 
       vm.userName; 

       vm.searchReddit = function() { 
        $http.get('https://www.reddit.com/user/' + vm.userName + '/about.json') 
         .then(function (response) { 
          vm.accountData = response.data.data; 
          vm.accountData.total_karma = vm.accountData.comment_karma + vm.accountData.link_karma; 
          $state.go('redditAnalyzer', { name: vm.userName }); 
         }); 
       } 
      } 
     ] 
    }); 

一旦我輸入我的用戶名,它會改變狀態。 在我app.js我有

angular.module('app', ['ui.router', 'chart.js']) 
    .config(['$stateProvider', '$urlRouterProvider', function ($stateProvider, $urlRouterProvider) { 
     $urlRouterProvider.otherwise('/'); 
     $stateProvider 
      .state('redditAnalyzer', { 
       url: '/analyze/:name', 
       component: 'redditAnalyzer', 
       resolve: { 
        resolve: 
        ['test', '$stateParams', function (test, $stateParams) { 
         var data = test.getAnalysisData($stateParams.name); 
         return data; 
        } 
        ] 
       } 
      }) 
      .state('home', { 
       url: '/', 
       component: 'home' 
      }); 
    }]); 

我打電話的功能test.getAnalysisData來獲取數據。

,在我test.js我有

angular.module('app') 
    .factory('test', ['$http', '$state', '$q', function ($http, $state, $q) { 
     var vm = this; 

     vm.accountData = {}; 
     vm.after = ''; 
     vm.bestComment = {}; 
     vm.bestComment.karma = 0; 
     vm.userName; 
     vm.bestComment.date = ''; 
     vm.subreddit = {}; 
     vm.myChart; 

     vm.getAnalysisData = function (redditUser) { 
      vm.userName = redditUser; 
      vm.resetData(redditUser); 
      vm.getAccountInfo(redditUser); 
      vm.getAllComments(redditUser); 
      return { 
       accountData: vm.accountData, 
       bestComment: vm.bestComment, 
       userName: vm.userName, 
       subreddit: vm.subreddit, 
       myChart: vm.myChart 
      }; 
     } 

     vm.resetData = function (user) { 
      vm.accountData = {}; 
      vm.after = ''; 
      vm.bestComment = {}; 
      vm.bestComment.karma = -(Math.pow(2, 53) - 1); 
      vm.userName = user; 
      vm.date = ''; 
      vm.subreddit = []; 
      vm.topThreeSub = []; 
     } 

     vm.getAccountInfo = function (user) { 
      $http.get('https://www.reddit.com/user/' + user + '/about.json') 
       .then(function (response) { 
        vm.accountData = response.data.data; 
        vm.accountData.total_karma = vm.accountData.comment_karma + vm.accountData.link_karma; 
        console.log("I got the account info!"); 
       }); 
     } 
     vm.getAllComments = function (user) { 
      $http.get('https://www.reddit.com/user/' + user + '/comments.json' + vm.after) 
       .then(
       function (response) { 
        console.log("I got the comment info!"); 
        tempResponse = response; 
        var data = response.data.data 
        vm.after = '?after=' + data.after; 
        for (i = 0; i < data.children.length; i++) { 
         if (vm.bestComment.karma < parseInt(data.children[i].data.score)) { 
          vm.bestComment.karma = parseInt(data.children[i].data.score); 
          vm.bestComment.comment = data.children[i].data.body; 
          vm.bestComment.date = (new Date(data.children[i].data.created * 1000)).toString(); 
         } 
         var tempSub = data.children[i].data.subreddit; 
         if (vm.subreddit[tempSub] === undefined) { 
          vm.subreddit[tempSub] = 1; 
         } 
         else { 
          vm.subreddit[tempSub]++; 
         } 
        } 
        if (response.data.data.after != null) { 
         vm.getAllComments(user); 
        } 
       }, function (error) { 
        console.log(error); 
        throw error; 
       }) 
       .catch(function (error) { }); 
     } 
     return { 
      resolve: vm.resolve, 
      hello: vm.hello, 
      getAnalysisData: vm.getAnalysisData 
     } 
    }]); 

我遞歸調用函數vm.getAllComments,因爲它的工作原理是vm.getAllComments將獲得該帳戶的第25層的意見,然後再從部分來自回覆的信息,我可以在賬戶中獲得接下來的25條評論。

終於,在我的redditanalyzer文件,我有

angular.module('app') 
    .component('redditAnalyzer', { 
     templateUrl: 'Content/app/components/redditAnalyzer.html', 
     bindings: { 
      resolve: '<' 
     }, 
     controller: ['$http', 'test', 
      function ($http, test) { 
       var vm = this; 
       vm.accountData = {}; 
       vm.bestComment = {}; 
       vm.bestComment.karma = 0; 
       vm.userName; 
       vm.bestComment.date = ''; 
       vm.subreddit = {}; 
       vm.myChart; 

       vm.$onInit = function() { 
        console.log("this is the resolve", vm.resolve); 
        //vm.accountData = resolve.accountData; 
        //vm.bestComment = resolve.bestComment; 
        //vm.myChart = resolve.myChart; 
        //vm.subreddit = resolve.subreddit; 
        //vm.userName = resolve.userName; 
       } 

      }] 
    }); 

而且你可以看到在我的控制檯中的問題。

this is the resolve {accountData: {…}, bestComment: {…}, userName: "spez", subreddit: Array(0), myChart: undefined}accountData: {}bestComment: {karma: 22200, comment: "Reddit search might work by then.", date: "Thu Oct 27 2016 01:07:22 GMT-0400 (Eastern Daylight Time)"}myChart: undefinedsubreddit: [blog: 10, announcements: 475, modnews: 34, programming: 32, ModSupport: 20, …]userName: "spez"__proto__: Object 
test.js:44 I got the account info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
test.js:51 I got the comment info! 
7test.js:51 I got the comment info! 

即使在承諾之前,它也會更改路線。 我應該如何等待我的所有承諾?

+0

解析器不會等待的承諾,因爲代碼不返回對解決方案的承諾。 – georgeawg

回答

1

解析器不等待承諾,因爲代碼沒有向解析器返回承諾。

getAllComments函數需要返回一個承諾:

vm.getAllComments = function (user) { 
     ̲r̲e̲t̲u̲r̲n̲ $http.get('https://www.reddit.com/user/' + user + '/comments.json' + vm.after) 
      .then(
      function (response) { 
       console.log("I got the comment info!"); 
       tempResponse = response; 
       var data = response.data.data 
       vm.after = '?after=' + data.after; 
       for (i = 0; i < data.children.length; i++) { 
        if (vm.bestComment.karma < parseInt(data.children[i].data.score)) { 
         vm.bestComment.karma = parseInt(data.children[i].data.score); 
         vm.bestComment.comment = data.children[i].data.body; 
         vm.bestComment.date = (new Date(data.children[i].data.created * 1000)).toString(); 
        } 
        var tempSub = data.children[i].data.subreddit; 
        if (vm.subreddit[tempSub] === undefined) { 
         vm.subreddit[tempSub] = 1; 
        } 
        else { 
         vm.subreddit[tempSub]++; 
        } 
       } 
       if (response.data.data.after != null) { 
        ̲r̲e̲t̲u̲r̲n̲ vm.getAllComments(user); 
       } else { 
        ̲r̲e̲t̲u̲r̲n̲ ̲v̲m̲.̲b̲e̲s̲t̲C̲o̲m̲m̲e̲n̲t̲;̲ 
       } 
      }, function (error) { 
       console.log(error); 
       throw error; 
      }) 
      ̶.̶c̶a̶t̶c̶h̶(̶f̶u̶n̶c̶t̶i̶o̶n̶ ̶(̶e̶r̶r̶o̶r̶)̶ ̶{̶ ̶}̶)̶;̶ 
    } 

使用$q.all創建等待多個承諾一個承諾:

vm.getAnalysisData = function (redditUser) { 
     vm.userName = redditUser; 
     vm.resetData(redditUser); 
     vm.getAccountInfo(redditUser); 
     ̲v̲a̲r̲ ̲a̲l̲l̲C̲o̲m̲m̲e̲n̲t̲s̲P̲r̲o̲m̲i̲s̲e̲ ̲=̲ vm.getAllComments(redditUser); 
     return $q.all({ 
      accountData: vm.accountData, 
      bestComment: vm.bestComment, 
      userName: vm.userName, 
      subreddit: vm.subreddit, 
      myChart: vm.myChart, 
      ̲a̲l̲l̲C̲o̲m̲m̲e̲n̲t̲s̲:̲ ̲a̲l̲l̲C̲o̲m̲m̲e̲n̲t̲s̲P̲r̲o̲m̲i̲s̲e̲ 
     }); 
    } 

欲瞭解更多信息,請參閱

0

我額外的,你使用的是什麼版本的UI路由器的?最新'$ stateParams'已被棄用,並以$ transition $復發。你

而且不`噸需要使用這個

url: '/analyze/:name', 

在UI的路由器的傳統,在URL路徑中找到一個參數是可選。 如果在URL中找不到該參數,它將匹配空的 字符串。

您可以替換爲:

url: '/analyze/', 

params: { 
    name: "" 
    } 

您可以閱讀遷移guid