$ д используется для управления асинхронным в 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
извините за форматирование .. я хочу вызвать нормальную функцию, которая не является асинхронной, может $ a сделать асинхронной или нет .. ?? – suhas