2016-09-14 65 views
2

我得到我的應用程序對象通過調用像這樣的服務功能訪問對象:角 - 如何從承諾

$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

回答

1

本質上講,你使用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

0

我認爲,問題在於你設置

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

把回調內部的分配,而不是,所以你不變量設置爲諾如:

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