Яка різниця між функцією зворотного виклику та обіцянками в JS і в якому випадку ми повинні їх використовувати?


Відповідь 1:

Відклики викликів - це досить старий хак, який робився тому, що обіцянки тоді не виконувались. Ніхто не думав, що JavaScript вибухне так сильно до кінця 2000-х. Обіцянки - це шлях до майбутнього Javascript, оскільки вони зараз є частиною стандартів ES6. Ще до того, як цей стандарт був запропонований, деякі добрі люди впровадили деякі рамки, такі як "q", щоб повторити обіцянки. Тож основні рамки, такі як Angular 1.x та React, отримали обіцянки за замовчуванням. У будь-якому випадку, якщо ви зараз плануєте написати якийсь код на JavaScript, завжди використовуйте обіцянки.

щоб відповісти на ваше первісне запитання, вони обидва роблять те саме, але трохи інакше. Припустимо, що ви повинні виконати деякі завдання відразу після завершення вашого запиту на ajax. Ми ніколи не дізнаємось, коли ваш запит буде успішним / невдалим через затримку в мережі, і ми не можемо використовувати потоки, оскільки JS є однопоточною. Ми не можемо заблокувати основний потік, оскільки це зробить браузер непридатним для користувача. тому ми реєструємо зворотній зв'язок / обіцянку під час виклику функції та переходимо до інших завдань, і як тільки завдання буде виконано, завдання буде виконано після цього.


Відповідь 2:

Зворотний виклик - це функція, яка викликається після завершення певної операції. Це запобігає блокуванню коду.

Однією з очевидних проблем із зворотними дзвінками є те, коли у вас кілька асинхронних операцій залежать один від одного. Отже, у вас будуть зворотні дзвінки, вкладені всередину зворотних викликів, вкладені всередині зворотних викликів тощо.

функціяUserExists (id, зворотний виклик) {
   getDatabase (функція (db) {
       getUser (db, 'користувачів', id, функція (користувач) {
           var знайдено = (користувач)? правда: хибна;
           зворотний дзвінок (знайдено);
       })
    })
}

З іншого боку, обіцянки - це об'єкти, що представляють результат асинхронної операції.

Вони використовують зворотні виклики, щоб забезпечити кращий і простіший спосіб управління асинхронною роботою, а також вирішити проблему вкладених зворотних зворотних викликів (використовуючи тоді ()), а керування помилками стає менш болісним (використання .error () та .catch ()).

функція isUserExists (id) {
    повернути getDatabase (). тоді (функція (db) {
        повернути getUser (db, 'users', id);
    }). тоді (функція (користувач) {
        повернути (користувач)? правда: хибна;
    }). catch (функція (e) {
       // керування помилками
    });
}

// Тепер ми можемо отримати значення, вирішене об'єктом обіцянки
// повертається методом then () у функції isUserExists ().
isUserExists.then (функція (userExists) {
   // виконайте роботу функції зворотного виклику () у попередньому прикладі тут.
});

// Обіцянка
функція getDatabase (дані) {
 повернути нове Обіцяння (функція (вирішити, відхилити) {
     // робити будь-яку асинхронну операцію та перевіряти, чи повернулась помилка
     якщо (помилка) відхилити (помилка);
     інакше вирішити (db);
 });
}

Примітка. Метод тоді () повертає обіцянку. Якщо метод обробника повертає значення, то повернення, яке повертається до цього часу (), вирішується як повернене значення як його значення. І якщо він повертає вже розв'язану обіцянку, то обіцянка, повернута до цього часу (), вирішується зі значенням цієї обіцянки як її цінністю.