0

私はこの例を持っています:

var lastTime = '';
$scope.loadEvents = function () {
   var items = listEvents();
    items.then(function (data) {
        lastTime = data;
    });
};


$scope.openModal = function (data) {
     //i want to use lastTime here;   
};

私が呼び出しているボタンをクリックすると、それが返さopenModal()れることを確認したいのです。data

だから私はloadEvents()関数からプロミスを返さなければならないと思う

何か案は?

4

1 に答える 1

2

非同期操作から確実にデータを取得したい場合、処理する最善の方法は、ソースから promise を返し (連鎖します)、それを で使用することOpenModalです。これにより、モーダルをクリックするたびにデータが常に返され、同期の問題が発生しなくなります。

$scope.loadEvents = function () {
   var items = listEvents();
   return items.then(function (data) { //Make the loadEvents return a promise
       return data;  //return the data after any mapping or anything you may want to do
    });
};


$scope.openModal = function (data) {
     $scope.loadEvents().then(function(data){ //
         lastTime = data;
     });
};

応答がまだサーバーから返されていないときに複数の同時呼び出しを回避するために、以前に作成したものと同じ promise を返すことができます。

 var _cachedPromise;
 $scope.loadEvents = function () {
   var items = listEvents();
    //Actually you could chain all these together but for clarity steps have been broken down.
    if(_cachedPromise) return _cachedPromise;

    _cachedPromise = items.then(function (data) { //Make the loadEvents return a promise
       return data;  //return the data after any mapping or anything you may want to do
    });

    //Cleanup promise to make fresh calls.
    _cachedPromise.finally(function(){
        _cachedPromise = null;
    });

   return _cachedPromise;
};

しかし、このキャッシュ約束ロジックは、理想的にはコントローラーではなくサービスで処理する必要があります...

于 2014-08-10T23:45:18.677 に答える