Використання 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
}