2016-05-30 11 views
0

私はそれが可能であれば、私はタイムアウトを取り除くことができるように約束を実装する方法は?私は、「プリム」の工場からいくつかのデータを取得する機能ルックのようだ:関数、angularjsの約束

$scope.getPre = function(id){ 

var url = WEB_API.MainUrl + '/api/prim/' + id +'/' + $window.sessionStorage.getItem('idsom'); 

    Prim.getprim(function(data) { 

     $scope.prim1 = data; 
     $scope.prim = $scope.prim1[0]; 

    }, url); 

    $scope.$apply(); 

} 

と私はオフに取り除くしたいタイムアウト:

setTimeout(function() { // it can't work without timeout 
    $scope.getPre($routeParams.idprim); 
}, 100); 
+1

コールバックを使用するとクリーナーになります –

+0

オプションは有望ですが、私は約束事に変更しなければならないプロジェクトにタイムアウトがたくさんあります。コールバックを使用すると、読みにくく複雑なものになります – Mark

+1

'var promise = new Promise (res、rej)=> {foo(/ *コールバック*/res); }}; '' foo'はあなたがコールバックを取るのを待つ必要がある非同期なものです。そしてあなたの 'setTimeout'sを持つコードのどこかで' promise.then(()=>/*)を実行します。 .. * /); ' –

答えて

0

あなたが使用できるように、あなたの関数は、約束を返す必要がありますその上.then()

$scope.getPre = function(id){ 
    var deferred = $q.defer() 
    var url = WEB_API.MainUrl + '/api/prim/' + id +'/' + $window.sessionStorage.getItem('idsom'); 

    Prim.getprim(function(data) 
     $scope.prim1 = data; 
     $scope.prim = $scope.prim1[0]; 
     deferred.resolve(); 
    }, url); 

    return deferred.promise; 
} 

そして、ちょうどこのようにそれを使用します。

$scope.getPre($routeParams.idprim).then(function() { 
    // Do whatever you did after setTimeout 
});