2016-04-18 10 views
0

私は1分以上かかり、データを返すかもしれないサービスを作った。 サービスコードの一部です。呼び出すまでの角度保留機能deferred.resolve

var deferred = $q.defer(); 
    //check data is in cache 
    //if not, some process (take some time) 
    deferred.resolve(data); 
    }); 
return deferred.promise; 

このサービスを2つのjsファイルで連続して使用しようとしました。これは、サービスを呼び出すjsコードの一部です。

myService.get().then(function(data) { //works }); 

これは動作する方法です。

負荷A.js - >サービス負荷 - >(多少時間がかかる)データを取得 - > キャッシュ内のデータを保存する - >プロセスA.js - >負荷B.js - >サービス負荷 - >データを取得キャッシュ→プロセスB.js

A.jsとB.jsファイルがほぼ同時に読み込まれるため、これは現在の動作です。

負荷A.js - >サービス負荷 - >(多少時間がかかる)データを取得 - >その間B.jsを読み込む - >サービス負荷 - > - >がデータを取得するには(いくつかの時間がかかる)のデータの読み込みにを複製...

A.jsサービスまたはB.jsサービスのいずれかが既にサービスで動作している場合、どのように保留する必要がありますか?

答えて

1

私は最近同じ問題を抱えていました。ここで私はそれを解決するために何をしたのですか?

アイデアは、http要求がまだ進行中かどうかを識別するフラグを作成し、$ timeoutを使用して前の要求が解決されるまで再試行します。再試行を行う前に、遅延オブジェクトは直ちに返されますが、後で解決されます。あなたのサービスで

このような何か、: -

var httpInProgress = false; // used to identify if a request is still in progress 

//this is your service method 
service.loadData = function(yourParam, defer, shouldNotReturn){ 
    if(!defer){ 
     defer = $q.defer(); 
    } 

    if(httpInProgress){ 
     //if http already in progress, retry again with the same defer object. 
     $timeout(function(){service.loadData(yourParam, defer, true);}, 100); 
     if(!shouldNotReturn){ 
      //return a promise but resolve later when we actual deal with http 
      return defer.promise; 
     } 
    }else{ 
     //do normal stuff if no http in progress 
     service.sendActualRequest(); 
    } 
}; 

service.sendActualRequest = function(yourParam, defer){ 
    httpInProgress = true; 
    $http(request).then(function(res){ 
     defer.resolve(res); 
    }, function(err){ 
     defer.reject(err); 
    }).finally(function(){ 
     httpInProgress = false; 
    }); 

    return defer.promise; 
}; 
+0

それは、直接私のサービスに使用するのは難しいのですが、あなたは私に新しい姿を与えました。ありがとう:) –

関連する問題