
рдпрд╣рд╛рдВ рдХреБрдЫ рдмрд┐рдВрджреБ рджрд┐рдП рдЧрдП рд╣реИрдВ рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реЛрдВрдЧреЗред
1. рдлрд┐рд░ рд╣рдореЗрд╢рд╛ рдПрдХ рдирдпрд╛ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИ
рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:
function asyncFunction() { var deferred = $q.defer(); doSomethingAsync().then(function(res) { res = asyncManipulate(res); deferred.resolve(res); }, function(err) { deferred.reject(err); }); return deferred.promise; }
$q.defer()
рдХрд╛ рдПрдХ рдирдпрд╛ рд╡рд╛рджрд╛ рдирд┐рд░рд░реНрдердХ рд░реВрдк рд╕реЗ рдпрд╣рд╛рдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХреЛрдб рдХреЗ рд▓реЗрдЦрдХ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рддрдм рд╡рд╣ рдПрдХ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░реЗрдЧрд╛ред рдХреЛрдб рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рддрддреНрдХрд╛рд▓реАрди рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдПрдБ:
function asyncFunction() { return doSomethingAsync().then(function(res) { return asyncManipulate(res); }); }
2. рд╡рд╛рджреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо "рд╣рд╛рд░рд╛ рдирд╣реАрдВ рд╣реИ"
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдлрд┐рд░ рд╕реЗ:
function asyncFunction() { return doSomethingAsync().then(function(res) { return asyncManipulate(res); }, function(err) { return $q.reject(err); }); }
doSomethingAsync
рдлрд╝рдВрдХреНрд╢рди
doSomethingAsync
рдХрд╛ рдХреЛрдИ рднреА рдкрд░рд┐рдгрд╛рдо, рдЪрд╛рд╣реЗ рд╡рд╣ рд╣рд▓ рд╣реЛ рдпрд╛ рдЕрд╕реНрд╡реАрдХрд╛рд░, "рдкреЙрдк рдЕрдк" рдХрд░реЗрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рд╡рд╣ рдЕрдкрдиреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдирд╣реАрдВ рдвреВрдВрдврддрд╛ (рдпрджрд┐ рд╣реИрдВрдбрд▓рд░ рд╕рднреА рдореЗрдВ рдореМрдЬреВрдж рд╣реИ)ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдмрд╕ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдкрд░рд┐рдгрд╛рдо рдХрд╣реАрдВ рднреА рдЧрд╛рдпрдм рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдпрд╣ рдмрд╕ рдЪрд▓рддрд╛ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рджреВрд╕рд░реЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ), рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рд╣реЗрд░рдлреЗрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
function asyncFunction() { return doSomethingAsync().then(function(res) { return asyncManipulate(res); }); }
рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдорд╛рдорд▓реЗ рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЛ рднреА рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
function asyncFunction() { return doSomethingAsync().then(null, function(err) { return errorHandler(err); }); }
рд╡реИрд╕реЗ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рдЪреАрдиреА рд╣реИ:
function asyncFunction() { return doSomethingAsync().catch(function(err) { return errorHandler(err); }); }
3. рдЖрдк рдХреЗрд╡рд▓ $ q.reject () рд▓реМрдЯрд╛рдХрд░ рдЕрд╕реНрд╡реАрдХреГрдд рд╣реИрдВрдбрд▓рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдХреЛрдб:
asyncFunction().then(function (res) { // some code return res; }, function (res) { // some code }).then(function (res) { console.log('in resolve'); }, function (res) { console.log('in reject'); });
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдХреИрд╕реЗ
asyncFunction
рдлрд╝рдВрдХреНрд╢рди
asyncFunction
, рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╣рдо '
asyncFunction
' рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрд╕реНрд╡реАрдХрд╛рд░ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рддрд░реАрдХрд╛ рд╣реИ - $ q.reject () рд▓реМрдЯреЗрдВред рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╕рдВрдХрд▓реНрдк рд╣реИрдВрдбрд▓рд░ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдо рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдо рдХрдВрд╕реЛрд▓ рдореЗрдВ 'рдЕрд╕реНрд╡реАрдХрд╛рд░ рдореЗрдВ' рджреЗрдЦреЗрдВ рдпрджрд┐
asyncFunction
рд░рд┐рдЯрд░реНрди рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ:
asyncFunction().then(function (res) { // some code return res; }, function (res) { // some code return $q.reject(res); }).then(function (res) { console.log('in resolve'); }, function (res) { console.log('in reject'); });
4. рдЖрдЦрд┐рд░рдХрд╛рд░ рд╡рд╛рджреЗ рдХрд╛ рдирддреАрдЬрд╛ рдирд╣реАрдВ рдмрджрд▓рддрд╛
asyncFunction().then(function (res) { importantFunction(); return res; }, function (err) { importantFunction(); return $q.reject(err); }).then(function (res) { // some resolve code }, function (err) { // some reject code })
рдпрджрд┐ рдЖрдкрдХреЛ рд╡рд╛рджреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЕрдВрддрддрдГ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬрд┐рд╕реЗ рд╣рдореЗрд╢рд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдВрддрддрдГ рдмреНрд▓реЙрдХ рдЖрдЧреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╡рд╛рджреЗ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред рдореЗрдВ рд╕реБрдзрд╛рд░:
asyncFunction().finally(function () { importantFunction(); }).then(function (res) { // some resolve code }, function (err) { // some reject code })
рдпрджрд┐ рдЕрдВрдд рдореЗрдВ рд╣реИрдВрдбрд▓рд░ $ q.reject () рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЕрдЧрд▓рд╛ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рд╕рдВрдХрд▓реНрдк рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред
5. $ q.all рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ
рдиреЗрд╕реНрдЯреЗрдб рдХреЙрд▓ рдЪреЗрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
loadSomeInfo().then(function(something) { loadAnotherInfo().then(function(another) { doSomethingOnThem(something, another); }); });
doSomethingOnThem
рдлрд╝рдВрдХреНрд╢рди рдХреЛ
loadSomeInfo
рдФрд░
loadAnotherInfo
рджреЛрдиреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдФрд░ рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрд╣ рдХреЗрд╡рд▓ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж
doSomethingOnThem
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕ рдХреЛрдб рдХреЗ рд▓реЗрдЦрдХ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ $ q.all рдкрджреНрдзрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ред рд╣рдо рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
$q.all([loadSomeInfo(), loadAnotherInfo()]).then(function (results) { doSomethingOnThem(results[0], results[1]); });
$ q.all рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЪрд▓рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред $ Q.all рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП рд╡рд╛рджреЗ рдХреЛ рддрдм рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рд╕рд░рдгреА рдХреЗ рд╕рднреА рдХрд╛рд░реНрдп рдкреВрд░реЗ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рдкрд░рд┐рдгрд╛рдо рдкрд░рд┐рдгрд╛рдо рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдХреНрд░рдорд╢рдГ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП, $ q.all рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
6. $ q.when рдПрдХ рд╡рд╛рджреЗ рдореЗрдВ рд╕рдм рдХреБрдЫ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ
рдРрд╕реА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рд╣реЛрддреА рд╣реИрдВ рдЬрдм рдХреЛрдб рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдлрд┐рд░ рдЖрдк рдХреЛрдб рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдПрдХ рдЖрд╡рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ:
var promise; if (isAsync){ promise = asyncFunction(); } else { var localPromise = $q.defer(); promise = localPromise.promise; localPromise.resolve(42); } promise.then(function (res) { // some code });
рдЗрд╕ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рднреА рдЧрд▓рдд рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╕рд╛рдл рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ:
$q.when(isAsync? asyncFunction(): 42).then(function (res) { // some code });
$ q.when рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░реЙрдХреНрд╕реА рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рд╡рд╛рджреЗ рдпрд╛ рдирд┐рдпрдорд┐рдд рдореВрд▓реНрдп рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╣рдореЗрд╢рд╛ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред
7. рд╡рд╛рджрд╛ рдореЗрдВ рд╕рд╣реА рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ
рдЖрдЗрдП рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦреЗрдВ:
function asyncFunction(){ return $timeout(function meAsynk(){ throw new Error('error in meAsynk'); }, 1); } try{ asyncFunction(); } catch(err){ errorHandler(err); }
рдХреНрдпрд╛ рдЖрдкрдХреЛ рдпрд╣рд╛рдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ? рдХреЛрд╢рд┐рд╢ / рдХреИрдЪ рдмреНрд▓реЙрдХ рдХреЗрд╡рд▓ рдЙрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝ рд▓реЗрдЧрд╛ рдЬреЛ рддрдм рд╣реЛрддреА рд╣реИрдВ рдЬрдм
asyncFunction
рдлрд╝рдВрдХреНрд╢рди
asyncFunction
ред рд▓реЗрдХрд┐рди,
$timeout
рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди
meAsynk
рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рд╡рд╣рд╛рдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рднреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ
meAsynk
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддреНрд░реБрдЯрд┐рдпреЛрдВ (рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЕрдирдХреНрд░реЗрдбреЗрдб рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд░) рдХреЗ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдЧрд┐рд░ рдЬрд╛рдПрдВрдЧреАред рдЗрд╕ рд╣рд┐рд╕рд╛рдм рд╕реЗ рд╣рдорд╛рд░реЗ рдХреИрдЪ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЛрдИ рдкрд╣рдЪрд╛рди рдирд╣реАрдВ рдкрд╛рддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдХреЛрд╢рд┐рд╢ / рдкрдХрдбрд╝рдиреЗ рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рдкреЗрдЯрдирд╛ рдмреЗрдХрд╛рд░ рд╣реИред рд▓реЗрдХрд┐рди рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ? рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреЙрд▓рдмреИрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред $ Q рдореЗрдВ, рдРрд╕рд╛ рд╣реИрдВрдбрд▓рд░ рдЕрд╕реНрд╡реАрдХрд╛рд░ рд╣реИрдВрдбрд▓рд░ рд╣реИред
рд╣рдо рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗ (рд╣рдо рдКрдкрд░ рд╡рд░реНрдгрд┐рдд
catch
рдЪреАрдиреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ):
function asyncFunction(){ return $timeout(function meAsynk(){ throw new Error('error in meAsynk'); }, 1); } asyncFunction().catch(function (err) { errorHandler(err); });
рдПрдХ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
function asyncFunction() { var promise = doSomethingAsync(); promise.then(function() { return somethingAsyncAgain(); }); return promise; }
рдЗрд╕ рдХреЛрдб рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ: рдЕрдЧрд░
somethingAsyncAgain
рдлрд╝рдВрдХреНрд╢рди рд░рд┐рдЬреЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ (рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ, рд░рд┐рдЬреЗрдХреНрдЯ рд╣реЛрдиреЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд░рд┐рдЬреЗрдХреНрдЯ рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ), рддреЛ рдХреЛрдб рдЬрд┐рд╕реЗ рд╣рдорд╛рд░реЗ рдлрдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрднреА рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ред рд╡рд╛рджреЗ рд╕реБрд╕рдВрдЧрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рдкрд┐рдЫрд▓реЗ рдПрдХ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╡рд╛рджрд╛ рдЯреВрдЯ рдЧрдпрд╛ рд╣реИред рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
function asyncFunction() { return doSomethingAsync().then(function() { return somethingAsyncAgain(); }); }
рдЕрдм рд╣рдорд╛рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ someAsyncAgain рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЙрдЪреНрдЪ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЖрдЗрдП рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦреЗрдВ:
asyncFunction().then( function() { return somethingElseAsync(); }, function(err) { errorHandler(err); });
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдмрд╛рд░ рд╕рдм рдХреБрдЫ рд╕рд╣реА рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдлрдВрдХреНрд╢рди рдореЗрдВ
somethingElseAsync
, рддреЛ рд╡рд╣ рдХрд┐рд╕реА рдХреЛ рднреА рдкреНрд░реЛрд╕реЗрд╕ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рд╣рдо рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЕрд╕реНрд╡реАрдХрд╛рд░ рд╣реИрдВрдбрд▓рд░ рдЕрд▓рдЧ рд╣реЛ рдЬрд╛рдП:
asyncFunction().then(function() { return somethingElseAsync(); }).catch(function(err) { errorHandler(err); });
рдЕрдм рдЬреЛ рднреА рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреА, рдЙрд╕ рдкрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЬрд╛рдПрдЧреАред
рдкреБрдирд╢реНрдЪ
$ Q рд╕реЗрд╡рд╛ рд╡рд╛рджреЛрдВ / A + рдорд╛рдирдХ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдЧрд╣рд░реА рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕ рдорд╛рдирдХ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред
рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ jQuery рдореЗрдВ рд╡рд╛рджрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд╛рджрд╛ / рдП + рдорд╛рдирдХ рд╕реЗ рдЕрд▓рдЧ рд╣реИред рдЬреЛ рд▓реЛрдЧ рдЗрди рдЕрдВрддрд░реЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рд╡реЗ рдЗрд╕ рд▓реЗрдЦ рд╕реЗ рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред