2016-09-22 2 views
1
 * 

// for the purpose of this example let's assume that variables `$q` and `okToGreet` 
      // are available in the current lexical scope (they could have been injected or passed in). 
      // perform some asynchronous operation, resolve or reject the promise when appropriate. 


     function asyncGreet(name) { 

      return $q(function(resolve, reject) { //function to call in $q 
      setTimeout(function() { 
       if (okToGreet(name)) { 
       myFun()////call function in here which is not async 
       resolve('Hello, ' + name + '!');//call function in here 
       } else { 
       reject('Greeting ' + name + ' is not allowed.'); 
       } 

      }, 1000); 
      }); 
     } 

    // for the purpose of this example let's assume that variables `$q` and `okToGreet` 
     // are available in the current lexical scope (they could have been injected or passed in). 
     // perform some asynchronous operation, resolve or reject the promise when appropriate. 
//function to call in $q 

*

+0

извините за форматирование .. я хочу вызвать нормальную функцию, которая не является асинхронной, может $ a сделать асинхронной или нет .. ?? – suhas

ответ

1

$ д используется для управления асинхронным в 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>

Resolve вызывается в середине, но в консоли мы видим, что называется последним. Причина - асинхронное поведение $ q, callback вызывается после текущего стека вызовов, поэтому после кода в setTimeout.

Такая же ситуация с вызовом setTimeout без времени, она будет работать асинхронно после текущего стека вызовов.

Я намеренно устанавливаю номера в консольных журналах, цифры показывают позицию вызовов в коде, но асинхронный от $ q и тайм-аутов показывает, что позиция в коде и их реальный вызов не совпадают.

И на вопрос, что разрешение и отклонение не разрешено и не будут выполняться асинхронно для текущего стека вызовов, стандартный вызов функции будет выполняться стандартным образом, но в вашем примере у нас есть setTimeout после 1сек, поэтому более сложный стек вызовов, подобный этому :

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

Спасибо !!!! это означает, что мы вызываем функцию в $ q, поэтому будем действовать как асинхронный ... этот сценарий мы понимаем с вашей помощью – suhas

+1

@suhas если ответ помог, установите его как правильно. Благодарю. –

Смежные вопросы