Angularjs ui-router解决方案不会等待所有承诺

目前,我在等待我的承诺传递给解决方案时遇到问题。 据我所知,这是因为它是一个异步调用,所以决心不会等待所有的承诺,只是传递我的部分数据来解决。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!

即使在承诺之前,它也会更改路线。 我应该如何等待我的所有承诺?

回答:

解析器不等待承诺,因为代码没有向解析器返回承诺。

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̲

});

}

欲了解更多信息,请参阅

  • AngularJS $q Service API Reference - Chaining Promises
  • AngularJS $q.all Method API Reference
  • You're Missing the Point of Promises

回答:

我额外的,你使用的是什么版本的UI路由器的?最新'$ stateParams'已被弃用,并以$ transition $复发。你

而且不`吨需要使用这个

url: '/analyze/:name', 

在UI的路由器的传统,在URL路径中找到一个参数是可选。 如果在URL中找不到该参数,它将匹配空的 字符串。

您可以替换为:

url: '/analyze/', 

params: { 

name: ""

}

您可以阅读迁移guid

以上是 Angularjs ui-router解决方案不会等待所有承诺 的全部内容, 来源链接: utcz.com/qa/258203.html

回到顶部