角 - 如何从承诺

问题描述:

我得到我的应用程序对象通过调用像这样的服务功能访问对象:角 - 如何从承诺

$scope.quiz= QuizService.fetch($stateParams.quiz).$promise.then(function(result) { 
     return result; 

当我做console.log($scope.quiz)我得到这个:

Promise {$$state: Object} 
    $$state:Object 
    status:1 
    value:m 
    $promise:Promise 
    $resolved:true 
    active_question_id:1275 
    code:7690 
    id:200 
    mode:"multiplayer" 
    players:Array[2] 
    questionCount:7 
    question_time:10000 
    status:"active" 
    subjects:Array[0] 
    token:"i2L6OLEfAqfD3tLUCMzx" 
    topics:Array[0] 
    years:Array[1] 
    __proto__:Object 
    __proto__:Object 
__proto__:Object 

我想通过他们来访问object properties years, subjects and topic和循环,但是当我做console.log($scope.quiz.years)我得到

不确定

服务看起来是这样的:

fetch: function(id) { 
    var result = quizResource.get({id: id}); 

    result.$promise.then(function(quiz) { 
    service.setCurrent(quiz); }); 

    return result; 
    }, 

而且quizResource在QuizService看起来是这样的:

var quizResource = $resource(
    AppSettings.apiUrl + '/quizzes/:id/:verb', 
    { 
     id: '@id' 
    }, 
+0

您不能返回来自承诺'.then'的值。它的异步和调用代码在调用promise后返回。 – ste2425

+0

也发布了'quizResource.get()'代码。 – AndreaM16

本质上讲,你使用promisesresolvecallback需要产业链的功能。你应该使用promise重构你的两个函数fetchresourceGetter。您可以使用我在下面提供的模式(Take a look here),使用$q提供程序和许多其他变体。

你应该建立自己的QuizService

(function() { 
'use strict'; 

angular 
    .module('myApp') 
    .service('QuizService', function ($resource, AppSettings) { 

    function resourceGetter() { 
     return new Promise(function (resolve) { 
     return resolve ($resource(
        AppSettings.apiUrl + '/quizzes/:id/:verb', 
         { 
          id: '@id' 
         } 
     }); 
     }) 
    } 

    function fetchAndSet(params) { 
     return new Promise(function (resolve, reject) { 
     resourceGetter().then(function(response){ 
      if(response){ 
      return Promise.resolve(setCurrent(response)); 
     } 
      return reject({error : 'Error while fetch'}); 
     }) 
     }) 
    } 

    return { 
     fetchAndSet: fetchAndSet 
    } 
}); 
})(); 

,然后在你的modules,可以说一个Controller

. . . 
QuizService.fetchAndSet(parameter).then(function(result){ 
if(result.error){ 
    console.log('Error ':result.error); 
} 
console.log('Got '+result+' from fetch'); 
}); 

当然,你也可以重构setCurrent遵循这种模式。

此代码不能保证100%正常工作,因为我不确定你正在尝试做什么,而且你没有提供Plunker或类似的东西。

我敢肯定,如果你看看我的代码和我提供的链接,你就可以使它工作。

希望我一直有帮助。

+0

这就是服务现在的样子:'fetch:function(id){var _ result = quizResource.get({id:id}); result。$ promise.then(function(quiz){ service。的setCurrent(测验); }); 返回结果; },' – Marco

+0

Hi @Marco,编辑你的问题,并在你试图调用'服务的承诺'的地方添加'服务代码'和'代码'。 – AndreaM16

+0

编辑我的答案。 – AndreaM16

我认为,问题在于你设置

$scope.quiz= QuizService.fetch($stateParams.quiz).$promise.then(function(result) { 
    return result; 

把回调内部的分配,而不是,所以你不变量设置为诺如:

QuizService.fetch($stateParams.quiz).$promise.then(function(result) { 
    $scope.quiz = result;});