2016-09-22 7 views
1
​​3210

*

+0

申し訳ありませんがフォーマットしています...私は非同期ではない通常の関数を呼び出したい$ q非同期かどうか? – suhas

答えて

1

$ qをは、イベントプログラミングのtipicalあるJavaScriptで非同期的環境を管理するために使用されます。 $ qをでのコールバックもあり、それは(あなたの例では、それが現在のコールスタックなどのsetTimeoutコールバック関数になります)現在のコールスタックの後に呼び出します非同期。私はいくつかの例を準備:

var app=angular.module("app",[]); 
 

 
app.controller("cont",function($q){ 
 

 
    function asyncGreet() { 
 

 
    var deferred = $q.defer(); 
 
     
 
    setTimeout(function(){ 
 
     
 
     console.log("-- Standard log 1"); 
 
     
 
     //example asnychronous call using setTimeout 
 
     setTimeout(function(){ console.log("--- Call in timeout 2");}); 
 

 
     //our function is called as third 
 
     deferred.resolve(); 
 

 
     console.log("-- Standard log 4"); 
 
     console.log("-- Standard log 5"); 
 
     
 
    },1000); 
 
    
 
    return deferred.promise; 
 
    
 
    }; 
 
      
 
      
 
    
 
    console.log("- asyncGreat call 0"); 
 

 
    asyncGreet().then(function(){ 
 
    
 
    console.log("--- Resolve log 3"); 
 
    
 
    }); 
 
    
 
    console.log("- after asyncGreat call 6"); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="app" ng-controller="cont"> 
 
</div>

解決は途中で呼ばれるが、コンソールには、我々はそれが最後に呼ばれて参照されます。その理由は、コールバックが現在のコールスタックの後に呼び出され$ qをの非同期動作ですので、setTimeoutのすべてのコードの後に​​。

同じ状況が時間なしで呼び出しsetTimeoutであり、それは現在のコールスタックの後に非同期に実行されます。

は、私は意図的にコンソールログ内の数値を設定し、数字は、コードのコールの位置を示しているが、$ qとタイムアウトの非同期は、コード内の位置と実際が一致していないそれらを呼び出すことを示しています。

また、解決と拒否のみが現在の呼び出しスタックに対して非同期で実行されますが、標準の関数呼び出しは標準的な方法で実行されますが、この例では1秒後にsetTimeoutがあるため、 :

- asyncGreat() call 
-- async call of setTimeout callback after 1s 
--- async call code in second setTimeout 
--- async call code in resolve 
+0

ありがとうございます!!!!それは$ qの関数を呼び出して非同期として動作するようにするという意味です。このシナリオでは、私たちはあなたの助けによって理解しています – suhas

+1

答えが助けられたら、それは正しいものとして設定してください。ありがとう。 –

関連する問題