2016-05-18 68 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); 
})(); 

當我在服務getStatus檢查response的值,狀態的每一次變化它被稱爲(隊列 - >處理...處理 - >創建)。但是,控制器中的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

你爲我節省了很多痛苦兄弟。謝謝。 –