Что такое обещание в JavaScript?
JavaScript является одиночной резьбой, что означает, что два бита скрипта не могут работать одновременно; Они должны бежать один за другим. Обещание – это объект, который представляет собой возможное завершение (или неудачу) асинхронной операции и ее результирующее значение.
var promise = new Promise(function(resolve, reject) {
// do thing, then…
if (/* everything worked */) {
resolve("See, it worked!");
}
else {
reject(Error("It broke"));
}
});Обещание существует в одном из этих государств
- В ожидании: начальное состояние, не выполнено и не отклонено.
- Выполнено: операция успешно завершена.
- Отклонено: операция не удалась.
Объект обещания работает как прокси для значения, не обязательно известен, когда обещание создано. Это позволяет объединять обработчики с возможным успехом асинхронного действия или причиной неудачи.
Это позволяет асинхронным методам возвращает значения, такие как синхронные методы: вместо немедленно возвращая конечное значение, асинхронный метод возвращает обещание поставить значение в какой-то момент в будущем.
Используя «Тогда» (цепочка обещания)
Чтобы взять несколько асинхронных звонков и синхронизируйте их один за другим, вы можете использовать цепочки обещания. Это позволяет использовать значение из первого обещания в более поздних последующих обратных вызовах.
Promise.resolve('some')
.then(function(string) { // <-- This will happen after the above Promise resolves (returning the value 'some')
return new Promise(function(resolve, reject) {
setTimeout(function() {
string += 'thing';
resolve(string);
}, 1);
});
})
.then(function(string) { // <-- This will happen after the above .then's new Promise resolves
console.log(string); // <-- Logs 'something' to the console
});Обещание API
В классе обещания есть 4 статические методы:
- Обещание
- Обещание.reject
- Обещать. Все
- Обещание
Обещания могут быть церованы вместе
При написании обещаний решить конкретную проблему, вы можете объединить их вместе, чтобы сформировать логику.
var add = function(x, y) {
return new Promise((resolve,reject) => {
var sum = x + y;
if (sum) {
resolve(sum);
}
else {
reject(Error("Could not add the two values!"));
}
});
};
var subtract = function(x, y) {
return new Promise((resolve, reject) => {
var sum = x - y;
if (sum) {
resolve(sum);
}
else {
reject(Error("Could not subtract the two values!"));
}
});
};
// Starting promise chain
add(2,2)
.then((added) => {
// added = 4
return subtract(added, 3);
})
.then((subtracted) => {
// subtracted = 1
return add(subtracted, 5);
})
.then((added) => {
// added = 6
return added * 2;
})
.then((result) => {
// result = 12
console.log("My result is ", result);
})
.catch((err) => {
// If any part of the chain is rejected, print the error message.
console.log(err);
});Это полезно для следующего Функциональное программирование парадигма. Создавая функции для манипулирования данными, вы можете объединить их вместе, чтобы собрать конечный результат. Если в любой точке в цепочке функций значение является Отклонено Цепь будет пропущена до ближайшего поймать () обработчик.
Для получения дополнительной информации о функциональном программировании: Функциональное программирование
Функциональные генераторы
В последние релизы JavaScript ввел больше способов в родомственным обещаниям. Один такой способ – генератор функции. Функциональные генераторы являются «приостановленными» функциями. При использовании с обещаниями генераторы могут сделать намного легче читать и отображаться «синхронно».
const myFirstGenerator = function* () {
const one = yield 1;
const two = yield 2;
const three = yield 3;
return 'Finished!';
}
const gen = myFirstGenerator();Вот наш первый генератор, который вы можете увидеть по Функция * синтаксис. Ген Переменная, которую мы заявили, не будут работать MyFirstGenerator , но вместо этого будет «этот генератор готов к использованию».
console.log(gen.next());
// Returns { value: 1, done: false }Когда мы бежим gen.next () Это будет опровергать генератор и продолжить. Так как это первый раз, когда мы позвонили gen.next () Он будет работать Урожай 1 и пауза, пока мы не позвоним gen.next () опять таки. Когда Урожай 1 называется, это вернется к нам ценность это было уступлено и ли генератор сделано Отказ
console.log(gen.next());
// Returns { value: 2, done: false }
console.log(gen.next());
// Returns { value: 3, done: false }
console.log(gen.next());
// Returns { value: 'Finished!', done: true }
console.log(gen.next());
// Will throw an errorКак мы продолжаем звонить gen.next () Он продолжит идти на следующий доходность и пауза каждый раз. Как только нет больше доходность Слева от остальной части генератора будет продолжаться, что в этом случае просто возвращает 'Законченный!' . Если вы звоните gen.next () Опять же, он бросит ошибку, так как генератор закончен.
Теперь представьте, если каждый урожай В этом примере был Обещание Сам код будет выглядеть чрезвычайно синхронно.
Обещание. Все (потенциал) очень полезен для нескольких запросов к другому источнику
Метод Prosoft.all (IteAleable) возвращает одно обещание, которое решает, когда все обещания в утечленном аргументе разрешаются или когда не содержит никаких обещаний. Он отвергает причину первого обещания, которое отвергает.
var promise1 = Promise.resolve(catSource);
var promise2 = Promise.resolve(dogSource);
var promise3 = Promise.resolve(cowSource);
Promise.all([promise1, promise2, promise3]).then(function(values) {
console.log(values);
});
// expected output: Array ["catData", "dogData", "cowData"]Больше информации о обещаниях:
- Как JavaScript обещает на самом деле Работа
- Как реализовать обещания в JavaScript
- Как использовать обещания в JavaScript
- Как написать обещание JavaScript
Оригинал: “https://www.freecodecamp.org/news/javascript-promises-explained/”