рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдЬреЛ рдПрдХ рд╡рд╛рджрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ

рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмреАрдЪ рдПрдХ рдЫреЛрдЯрд╛ рд▓реЗрдХрд┐рди рдмрд▓реНрдХрд┐ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рд╣реИ рдЬреЛ рдмрд╕ рдПрдХ рд╡рд╛рджрд╛ рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ 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')) // => 'Catched' fn().catch(err => console.error('Catched')) // => TypeError: Cannot read property 'someProp' of undefined 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рджреЛрдиреЛрдВ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдПрдХ рд╣реА рд╢рд░реАрд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдПрдХ рддрд░реНрдХ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рджреЛрдиреЛрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ asyncFn async рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ asyncFn ред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ asnycFn рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╡рд╛рджрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдпрд╛ рддреЛ рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ рдпрд╛ рд╡рд┐рдлрд▓), рднрд▓реЗ рд╣реА рдЗрд╕рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ .catch() рдмреНрд▓реЙрдХ рдЗрд╕реЗ рдкрдХрдбрд╝ рд▓реЗрдЧрд╛ред

рд╣рд╛рд▓рд╛рдБрдХрд┐, fn рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрдВрдЬрди рдХреЛ рдЕрднреА рддрдХ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░реЗрдЧрд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП рдХреЛрдб .catch() рдмреНрд▓реЙрдХ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪреЗрдЧрд╛, рддреНрд░реБрдЯрд┐ рдкрдХрдбрд╝ рдореЗрдВ рдирд╣реАрдВ рдЖрдПрдЧреА рдФрд░ рдХрдВрд╕реЛрд▓ рдкрд░ рдЧрд┐рд░ рдЬрд╛рдПрдЧреАред

рдЕрдзрд┐рдХ рдЬреАрд╡рди рдЙрджрд╛рд╣рд░рдг


рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рддреБрдо рдЕрдм рдХреНрдпрд╛ рд╕реЛрдЪ рд░рд╣реЗ рд╣реЛ:
"рдЬрдм рдирд░рдХ рдореИрдВ рдРрд╕реА рдЧрд▓рддреА рдХрд░реВрдВрдЧрд╛?"

рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛?

рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВ рдЬреЛ рдмрд╕ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИред

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдФрд░ рдореЛрдВрдЧреЛрдбреАрдмреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдПрдХ рдЖрд╡реЗрджрди рд╣реИ рдЬреЛ рдореЛрдВрдЧреЛрдбреАрдмреА рдиреЛрдб.рдЬреЗрдПрд╕ рдЪрд╛рд▓рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдореБрдЭ рдкрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВрдиреЗ рдЗрд╕ рдЧреАрдереВрдм рднрдВрдбрд╛рд░ рдореЗрдВ рд╕рднреА рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рд░рдЦрд╛ рд╣реИ , рдЬрд┐рд╕рд╕реЗ рдЖрдк рдЗрд╕реЗ рдХреНрд▓реЛрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣рд╛рдВ рд╕рднреА рдХреЛрдб рдХреА рдирдХрд▓ рднреА рдХрд░реВрдВрдЧрд╛ред

рдпрд╣рд╛рдБ рд╣рдорд╛рд░реЗ app.js рдлрд╝рд╛рдЗрд▓ рд╣реИ:

 // app.js 'use strict' const express = require('express') const db = require('./db') const userModel = require('./models/user-model') const app = express() db.connect() app.get('/users/:id', (req, res) => { return userModel .getUserById(req.params.id) .then(user => res.json(user)) .catch(err => res.status(400).json({ error: 'An error occured' })) // <===  ! }) app.listen(3000, () => console.log('Server is listening')) 

.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 рдлрд╝рдВрдХреНрд╢рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 // models/user-model.js 'use strict' const ObjectId = require('mongodb').ObjectId const db = require('../db') const collectionName = 'users' module.exports = { /** * Get's a user by it's ID * @param {string} id The id of the user * @returns {Promise<Object>} The user object */ getUserById(id) { return db .getDb() .collection(collectionName) .findOne({ _id: new ObjectId(id) }) } } 

рдпрджрд┐ рдЖрдк 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() рдмреНрд▓реЙрдХ рдХреЛ рдЕрдЧрд▓реЗ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛?

 // app.js // ...  ... app.get('/users/:id', (req, res) => { return userModel .getUserById(req.params.id) .then(user => res.json(user)) .catch(err => res.status(400).json({ error: 'An error occured' })) // <===  ! }) // ...  ... 

рдирд╣реАрдВред рдЙрд╕реЗ рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдФрд░ рдЕрдЧрд░ рдЖрдк рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛ рдХреЛ рдЗрд╕ рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ?

 module.exports = { //  ,    async    ! async findById(id) { return db .getDb() .collection(collectionName) .findOne({ _id: new ObjectId(id) }) } } 

рд╣рд╛рдБ, рдЖрдк рд╕рдордЭрдиреЗ рд▓рдЧрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реИред рд╣рдорд╛рд░рд╛ .catch() рдмреНрд▓реЙрдХ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╣рдо рдкрдХрдбрд╝реЗ рдЧрдП рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред

рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рдмрдЬрд╛рдп


рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдЖрдк рдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд░рд╣реА рд╣реЛрдЧреАред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдЖрдкрдХреЛ рд╣рдореЗрд╢рд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ - рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рд╣реИрдВред рдЙрдирдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдЕрднреА рднреА рд╡рд╛рджреЛрдВ рдкрд░ рдЪреАрдиреА рдХреА рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╣реИрдВред

рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдХрднреА-рдХрднреА рд╡рд╛рджреЗ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдмрджрд▓рд╛рд╡ рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм (рд╣рд╛рдБ, "рдирд╣реАрдВ рддреЛ") рдЖрдк рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдШрдЯрдирд╛ рдХрд╛ рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░рдг рдкрддрд╛ рдЪрд▓ рдЬрд╛рдПрдЧрд╛ред

рдкреАрдПрд╕ рдиреЛрдЯ perevред: рдореВрд▓ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрд░реЗрдЧ рдкреА рд╣рд┐рдХреНрд╕ рд╕реЗ рдПрдХ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА рдЫреЛрдбрд╝ рджреА рдЧрдИ рдереА, рдЬреЛ (рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдмрд╛рдж) рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдЙрджреНрдзреГрдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛:
рдореИрдВ рдПрдХ рд╡рд┐рд╡рд░рдг (рдореЗрд░реЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдорд╛рд╣реМрд▓ рдореЗрдВ) рдкрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬреЛ Promise.resolve({<body>}) , "рдкрдХрдбрд╝реЗ рдирд╣реАрдВ" рдЬрд╛рддреЗ рд╣реИрдВ:

 Promise.resolve((()=>{throw "oops"; })()) .catch(e=>console("Catched ",e)); //  .catch()      "" 

рд▓реЗрдХрд┐рди new Promise() ( рд▓рдЧрднрдЧ рдЕрдиреБрд╡рд╛рджред: рдореВрд▓ "рдЙрдЪрд┐рдд рд╡рд╛рджрд╛" ) рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ "рдкрдХрдбрд╝рд╛" рдЬрд╛рддрд╛ рд╣реИ:

 (new Promise((resolve,reject)=>{ resolve((()=>{throw "oops"})()) })) .catch(e=>console.log("Catched ",e)); // Catched oops 

рдЗрд╕ рдХрдерди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ:

 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")); // => 'Catched' fn().catch(err => console.error("Catched")); // => 'Catched' 

Source: https://habr.com/ru/post/hi475260/


All Articles