2016-09-14 8 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にアクセスしてループしていますが、実行すると

は定義されていません

サービスは次のようになります。

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

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

    return result; 
    }, 

そしてQuizServiceでquizResourceは次のようになります。基本的に

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

あなたが返すことはできません約束からの価値 '.then'。その非同期呼び出しコードは、約束が返されるまでに移動しています。 – ste2425

+0

'quizResource.get()'コードも投稿してください。 – AndreaM16

答えて

1

、あなたがpromisesresolveまたはcallbackを使用してチェーンにあなたの機能を必要としています。約束を使って、関数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をリファクタリングすることができます必要があります。

私はあなたがやろうとしている内容を正確に把握していないとあなたがPlunkerまたは類似を提供していませんでしたので、このコードは、100%の動作が保証されていません。

私のコードとリンクを見ていただければ、それを機能させることができます。

私は役に立ちました。

+0

これはサービスが今見える方法です: 'fetch:function(id){ var result = quizResource.get({id:id}); 結果。$ promise.then(function(quiz){ サービス。setCurrent(クイズ); }); 返品結果; }、 ' – Marco

+0

こんにちは@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;}); 
関連する問題