2016-05-18 8 views
0

私は何かを作成するコントローラ機能を持っています。関数が呼び出されると、setIntervalが実行され、項目のステータスが取得されます。ここで遅延プロミス値が更新/解決/延期されていません

はサービスです。

(function() { 
    'use strict'; 

    function myService($q) { 
     let deferred = $q.defer(); 

     function createSomething(name) { 
      Meteor.call('createSomething', name, (err, res) { 
       if (err) { 
        deferred.reject(err); 
       } else { 
        //value returned is the created item (id, name, status) 
        deferred.resolve(res); 
       } 
      }); 

      return deferred.promise; 
     } 

     function getStatus(id) { 
      Meteor.call('getStatus', id, (err, res) { 
       if (err) { 
        deferred.reject(err); 
       } else { 
        //statuses are queued, processing, created 
        deferred.resolve(res); 
       } 
      }); 

      return deferred.promise; 
     } 

     return { 
      createSomething: createSomething, 
      getStatus: getStatus 
     } 
    } 

    angular.module('myApp').factory('myService', myService); 
})(); 

そして、ここでは、コントローラです:

(function() { 
    'use strict'; 

    function myController($scope, myService) { 
     let ctrl = this; 

     ctrl.create = (name) => { 
      myService.createSomething(name) 
       .then((item) => { 
        ctrl.statusInterval = setInterval(() => { 
         myService.getStatus(item.data.id) 
          .then((status) => { 
           //status is always 'queued' :(
           if (status.data.status === 'created') { 
            clearInterval(ctrl.statusInterval); 
            //do something 
           } 
          }); 
        }, 5000); 
       }); 
     }; 
    } 

    angular.module('myApp').controller('myController', myController); 
})(); 

私はサービスgetStatusresponseの値をチェックすると、ステータスが毎回変わりますそれは呼び出されます(キュー→処理...処理→作成)。ただし、コントローラstatusの値は、常にqueueです。

解決するにはどうすればよいですか?

+0

ええと、 'createSomething'と' getStatus'が延期同じことを解決しようとしている両方の? – Bergi

答えて

5

createSomething()およびgetStatus()は、独自の約束を作成して返す必要があります。彼らは約束を共有することはできませんし、すべての場合に適切に動作します。

さらに、呼び出されるたびに同じ約束ではなく、呼び出されるたびに独自の約束を作成して返す必要があります。覚えておいてください、約束は一方向の状態機械です。解決または拒否された後は、resolve()またはreject()が再び呼び出されても、状態は決して変更されません。

ここでは例です:

function createSomething(name) { 
     // create a unique deferred inside this function each time you call it 
     let deferred = $q.defer(); 
     Meteor.call('createSomething', name, (err, res) { 
      if (err) { 
       deferred.reject(err); 
      } else { 
       //value returned is the created item (id, name, status) 
       deferred.resolve(res); 
      } 
     }); 

     return deferred.promise; 
    } 
+0

ああですから、約束を返す関数ごとに '$ q.defer()'を設定するべきです。ありがとう!それは今働きます! :) – dork

+0

あなたは私に多くの痛みを救った。ありがとう。 –

関連する問題