рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмреАрдЪ рдПрдХ рдЫреЛрдЯрд╛ рд▓реЗрдХрд┐рди рдмрд▓реНрдХрд┐ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рд╣реИ рдЬреЛ рдмрд╕ рдПрдХ рд╡рд╛рджрд╛ рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ
async
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
function fn(obj) { const someProp = obj.someProp return Promise.resolve(someProp) } async function asyncFn(obj) { const someProp = obj.someProp return Promise.resolve(someProp) } asyncFn().catch(err => console.error('Catched'))
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рджреЛрдиреЛрдВ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдПрдХ рд╣реА рд╢рд░реАрд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдПрдХ рддрд░реНрдХ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рджреЛрдиреЛрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐
asyncFn
async
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛
asyncFn
ред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐
asnycFn
рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╡рд╛рджрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдпрд╛ рддреЛ рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ рдпрд╛ рд╡рд┐рдлрд▓), рднрд▓реЗ рд╣реА рдЗрд╕рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ
.catch()
рдмреНрд▓реЙрдХ рдЗрд╕реЗ рдкрдХрдбрд╝ рд▓реЗрдЧрд╛ред
рд╣рд╛рд▓рд╛рдБрдХрд┐,
fn
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрдВрдЬрди рдХреЛ рдЕрднреА рддрдХ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░реЗрдЧрд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП рдХреЛрдб
.catch()
рдмреНрд▓реЙрдХ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪреЗрдЧрд╛, рддреНрд░реБрдЯрд┐ рдкрдХрдбрд╝ рдореЗрдВ рдирд╣реАрдВ рдЖрдПрдЧреА рдФрд░ рдХрдВрд╕реЛрд▓ рдкрд░ рдЧрд┐рд░ рдЬрд╛рдПрдЧреАред
рдЕрдзрд┐рдХ рдЬреАрд╡рди рдЙрджрд╛рд╣рд░рдг
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рддреБрдо рдЕрдм рдХреНрдпрд╛ рд╕реЛрдЪ рд░рд╣реЗ рд╣реЛ:
"рдЬрдм рдирд░рдХ рдореИрдВ рдРрд╕реА рдЧрд▓рддреА рдХрд░реВрдВрдЧрд╛?"
рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛?
рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВ рдЬреЛ рдмрд╕ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдФрд░ рдореЛрдВрдЧреЛрдбреАрдмреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдПрдХ рдЖрд╡реЗрджрди рд╣реИ рдЬреЛ рдореЛрдВрдЧреЛрдбреАрдмреА рдиреЛрдб.рдЬреЗрдПрд╕ рдЪрд╛рд▓рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдореБрдЭ рдкрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВрдиреЗ
рдЗрд╕ рдЧреАрдереВрдм рднрдВрдбрд╛рд░ рдореЗрдВ рд╕рднреА рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рд░рдЦрд╛
рд╣реИ , рдЬрд┐рд╕рд╕реЗ рдЖрдк рдЗрд╕реЗ рдХреНрд▓реЛрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣рд╛рдВ рд╕рднреА рдХреЛрдб рдХреА рдирдХрд▓ рднреА рдХрд░реВрдВрдЧрд╛ред
рдпрд╣рд╛рдБ рд╣рдорд╛рд░реЗ
app.js
рдлрд╝рд╛рдЗрд▓ рд╣реИ:
.catch()
рдмреНрд▓реЙрдХ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ! рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдЬрд╛рджреВ рд╣реЛрдЧрд╛ (рдирд╣реАрдВ рд╣реЛрдЧрд╛)ред
db.js
рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
db.js
рдлрд╝рд╛рдЗрд▓
db.js
рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
'use strict' const MongoClient = require('mongodb').MongoClient const url = 'mongodb://localhost:27017' const dbName = 'async-promise-test' const client = new MongoClient(url) let db module.exports = { connect() { return new Promise((resolve, reject) => { client.connect(err => { if (err) return reject(err) console.log('Connected successfully to server') db = client.db(dbName) resolve(db) }) }) }, getDb() { return db } }
рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ
user-model.js
рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ
getUserById
рдлрд╝рдВрдХреНрд╢рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдпрджрд┐ рдЖрдк
app.js
рдлрд╝рд╛рдЗрд▓ рдХреЛ
app.js
рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЬрдм рд╣рдо
localhost:3000/users/<id>
рд╣рдо
getUserById
рдлрд╝рдВрдХреНрд╢рди рдХреЛ
user-model.js
рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ,
id
рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЕрдиреБрд░реЛрдз рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрддреЗ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ:
localhost:3000/users/1
ред рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?
рдареАрдХ рд╣реИ, рдЕрдЧрд░ рдЖрдкрдиреЗ рдЙрддреНрддрд░ рджрд┐рдпрд╛: "рдореИрдВ MongoClient рд╕реЗ рдмрд╣реБрдд рдмрдбрд╝реА рдЧрд▓рддреА рджреЗрдЦреВрдВрдЧрд╛" - рдЖрдк рд╕рд╣реА рдереЗред рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:
Error: Argument passed in must be a single String of 12 bytes or a string of 24 hex characters
ред
рдФрд░ рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐
.catch()
рдмреНрд▓реЙрдХ рдХреЛ рдЕрдЧрд▓реЗ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛?
рдирд╣реАрдВред рдЙрд╕реЗ рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдФрд░ рдЕрдЧрд░ рдЖрдк рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛ рдХреЛ рдЗрд╕ рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ?
module.exports = {
рд╣рд╛рдБ, рдЖрдк рд╕рдордЭрдиреЗ рд▓рдЧрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реИред рд╣рдорд╛рд░рд╛
.catch()
рдмреНрд▓реЙрдХ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╣рдо рдкрдХрдбрд╝реЗ рдЧрдП рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред
рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рдмрдЬрд╛рдп
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдЖрдк рдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд░рд╣реА рд╣реЛрдЧреАред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдЖрдкрдХреЛ рд╣рдореЗрд╢рд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ - рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рд╣реИрдВред рдЙрдирдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдЕрднреА рднреА рд╡рд╛рджреЛрдВ рдкрд░ рдЪреАрдиреА рдХреА рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╣реИрдВред
рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдХрднреА-рдХрднреА рд╡рд╛рджреЗ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдмрджрд▓рд╛рд╡ рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм (рд╣рд╛рдБ, "рдирд╣реАрдВ рддреЛ") рдЖрдк рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдШрдЯрдирд╛ рдХрд╛ рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░рдг рдкрддрд╛ рдЪрд▓ рдЬрд╛рдПрдЧрд╛ред
рдкреАрдПрд╕ рдиреЛрдЯ perevред: рдореВрд▓ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрд░реЗрдЧ рдкреА рд╣рд┐рдХреНрд╕ рд╕реЗ рдПрдХ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА рдЫреЛрдбрд╝ рджреА рдЧрдИ рдереА, рдЬреЛ (рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдмрд╛рдж) рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдЙрджреНрдзреГрдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛:рдореИрдВ рдПрдХ рд╡рд┐рд╡рд░рдг (рдореЗрд░реЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдорд╛рд╣реМрд▓ рдореЗрдВ) рдкрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬреЛ Promise.resolve({<body>})
, "рдкрдХрдбрд╝реЗ рдирд╣реАрдВ" рдЬрд╛рддреЗ рд╣реИрдВ:
Promise.resolve((()=>{throw "oops"; })()) .catch(e=>console("Catched ",e));
рд▓реЗрдХрд┐рди new Promise()
( рд▓рдЧрднрдЧ рдЕрдиреБрд╡рд╛рджред: рдореВрд▓ "рдЙрдЪрд┐рдд рд╡рд╛рджрд╛" ) рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ "рдкрдХрдбрд╝рд╛" рдЬрд╛рддрд╛ рд╣реИ:
(new Promise((resolve,reject)=>{ resolve((()=>{throw "oops"})()) })) .catch(e=>console.log("Catched ",e));
рдЗрд╕ рдХрдерди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ:
async function fn() { <body> }
рд╢рдмреНрджрд╛рд░реНрде, рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдЗрд╕ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ:
function fn() { return new Promise((resolve,reject)=>{ resolve({ <body> }) }) }
рдирддреАрдЬрддрди, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝ рд▓реЗрдВрдЧреЗ рдпрджрд┐ <body> рдореЗрдВ new Promise()
( рд▓рдЧрднрдЧред рдЕрдиреБрд╡рд╛рджред рдореВрд▓: "рдЙрдЪрд┐рдд рд╡рд╛рджрд╛" ):
function fn() { return Promise.resolve({<body}); }
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ "рдкрдХрдбрд╝рдиреЗ" рдХреЗ рд▓рд┐рдП рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ рдХрд┐ Promise.resolve()
, рд▓реЗрдХрд┐рди new Promise()
рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ: function fn(obj) { return new Promise((resolve, reject) => { const someProp = obj.someProp; resolve(someProp); }); } async function asyncFn(obj) { return new Promise((resolve, reject) => { const someProp = obj.someProp; resolve(someProp); }); } asyncFn().catch(err => console.error("Catched"));