Використання Promise
класу
Рекомендую ознайомитись з документами MDN's Promise, які пропонують хорошу відправну точку для використання обіцянок. Крім того, я впевнений, що в Інтернеті є багато навчальних посібників. :)
Примітка: Сучасні браузери вже підтримують специфікацію Обіцянок ECMAScript 6 (див. Зв'язані вище документи MDN), і я припускаю, що ви хочете використовувати нативну реалізацію, без сторонніх бібліотек.
Що стосується фактичного прикладу ...
Основний принцип працює так:
- Ваш API викликається
- Ви створюєте новий об'єкт Promise, цей об'єкт приймає одну функцію як параметр конструктора
- Ваша надана функція викликається базовою реалізацією, а функції надаються дві функції -
resolve
іreject
- Після того як ви зробите свою логіку, ви зателефонуєте до однієї з них, щоб або повністю заповнити Обіцяння, або відхилити його з помилкою
Це може здатися багато, тому ось фактичний приклад.
exports.getUsers = function getUsers () {
// Return the Promise right away, unless you really need to
// do something before you create a new Promise, but usually
// this can go into the function below
return new Promise((resolve, reject) => {
// reject and resolve are functions provided by the Promise
// implementation. Call only one of them.
// Do your logic here - you can do WTF you want.:)
connection.query('SELECT * FROM Users', (err, result) => {
// PS. Fail fast! Handle errors first, then move to the
// important stuff (that's a good practice at least)
if (err) {
// Reject the Promise with an error
return reject(err)
}
// Resolve (or fulfill) the promise with data
return resolve(result)
})
})
}
// Usage:
exports.getUsers() // Returns a Promise!
.then(users => {
// Do stuff with users
})
.catch(err => {
// handle errors
})
Використання функції мови асинхронізації / очікування (Node.js> = 7.6)
У Node.js 7.6 компілятор v8 JavaScript був оновлений підтримкою async / wait . Тепер ви можете оголосити функції як такі async
, що означає, що вони автоматично повертають рішення, Promise
яке вирішується, коли функція асинхронізації завершує виконання. Всередині цієї функції ви можете використовувати await
ключове слово, щоб зачекати, поки інша Обіцянка не вирішиться.
Ось приклад:
exports.getUsers = async function getUsers() {
// We are in an async function - this will return Promise
// no matter what.
// We can interact with other functions which return a
// Promise very easily:
const result = await connection.query('select * from users')
// Interacting with callback-based APIs is a bit more
// complicated but still very easy:
const result2 = await new Promise((resolve, reject) => {
connection.query('select * from users', (err, res) => {
return void err ? reject(err) : resolve(res)
})
})
// Returning a value will cause the promise to be resolved
// with that value
return result
}