适当的承诺语法

时间:2014-07-23 22:25:21

标签: angularjs promise

我有一个服务调用,它返回一个Study对象。在这个研究对象中,我有一个案例列表。现在,当我这样做时,这是有效的。

$scope.study = StudyService.studies.get({id: $routeParams.studyIdentifier}); 

基本上,这将使我的HTML页面的研究成为模型。现在我想做这样的事情,遍历研究对象并对其元素(案例)执行操作

$scope.study = StudyService.studies.get({id: $routeParams.studyIdentifier});
for(var i=0; i< $scope.study.cases.length;i++){
console.log($scope.study.cases[i].id);
}

这不起作用,因为研究对象是一个承诺。当我使用Chrome调试器查看它时,它显示为一个承诺。什么是正确的语法才能做到这一点?

我试过了。

$scope.study = StudyService.studies.get({id: $routeParams.studyIdentifier}).
then(function(study){
for(var i=0; i< $scope.study.cases.length;i++){
console.log($scope.study.cases[i].id);
}
});

有人可以指出如何在上述背景下使用承诺吗?似乎无法在.then(函数(X){return Y})得到它;部分

1 个答案:

答案 0 :(得分:0)

您的第二次尝试已经结束,您只是没有在for循环中引用正确的数据。假设StudyService.studies.get返回一个承诺,当它被解析时返回study数据,你可以这样做:

StudyService.studies.get({id: $routeParams.studyIdentifier}).then(function(study) {
    for(var i=0; i< study.cases.length;i++){
        console.log(study.cases[i].id);
    }
});

关键是你必须使用传递给.then处理程序的数据,因为这是解析后的promise操作的结果(可能是这里的ajax调用)。

由于我没有StudyService.studies.get()的文档,因此假定它在解析了promise时返回study数据结构。如果在解析promise时返回稍微不同的内容,则必须稍微调整for循环的语法。

如果这仍然给您带来麻烦,那么在console.log(study)处理程序中添加.then并查看调试器以查看该数据结构的确切内容,以便您可以看到如何正确迭代案件。


根据您的评论,看起来StudyService.studies.get()正在返回一个包含其中的promise的对象,但返回的对象本身不是promise。这只是一个猜测,因为我没有任何东西可以调试并查看自己,但看起来好像如果你想要使用那个承诺,你必须到达返回的对象内部以获得它的承诺:

$scope.study = StudyService.studies.get({id: $routeParams.studyIdentifier});
$scope.study.$promise.then(function(study) {
    for(var i=0; i< study.cases.length;i++){
        console.log(study.cases[i].id);
    }
});

如果您仍然遇到相同的错误,那么您需要执行console.log($scope.study.$promise)来查看它是什么。如果您收到不同的错误,那么您可能需要在console.log(study)循环之前执行for以查看在那里传递的内容。如果你能提供一个我可以在调试器中看到的可运行样本,我可能会在10分钟内解决这个问题。这样,我只需要猜测,你必须尝试并报告。这是解决问题的一种非常缓慢的方式。