Обзор

Это решение для асинхронного программирования.

С точки зрения синтаксиса, Promise — это объект, из которого можно получать сообщения об асинхронных операциях.

Состояния Promise

Характеристики состояний

Асинхронные операции Promise имеют три состояния: pending (выполняется), fulfilled (успешно завершено) и rejected (завершено с ошибкой). За исключением результата асинхронной операции, никакая другая операция не может изменить это состояние.

Объекты Promise имеют только переходы состояний: из pending в fulfilled и из pending в rejected. После перехода в состояние fulfilled или rejected состояние больше не изменится, то есть resolved (settled).

const p1 = new Promise(function(resolve,reject){ resolve('success1'); resolve('success2'); }); const p2 = new Promise(function(resolve,reject){ resolve('success3'); reject('reject'); }); p1.then(function(value){ console.log(value); // success1 }); p2.then(function(value){ console.log(value); // success3 });

Недостатки состояний

Promise нельзя отменить. После создания он сразу выполняется, и его нельзя отменить на полпути.

Если не установлена функция обратного вызова, ошибки, выброшенные внутри Promise, не будут видны извне.

Когда Promise находится в состоянии pending, невозможно узнать, на каком этапе находится текущий прогресс (только начался или почти завершён).

Метод then

Метод then принимает две функции в качестве параметров. Первый параметр — это функция обратного вызова для случая успешного выполнения Promise, а второй параметр — функция обратного вызова для случая, когда Promise завершается с ошибкой. Будет вызвана только одна из двух функций.

Особенности метода then

Функция обратного вызова не будет вызвана до завершения текущего прохода очереди событий JavaScript.

const p = new Promise(function(resolve,reject){ resolve('success'); }); p.then(function(value){ console.log(value); }); console.log('first'); // first // успех

С помощью.thenфункции обратного вызова, добавленные в форму, будут вызваны независимо от того, когда.

При многократном вызове

.затем
вы можете добавить несколько функций обратного вызова, и они будут выполняться в порядке добавления и независимо.

const p = new Promise(function(resolve,reject){ resolve(1); }).then(function(value){ //First then // 1 console.log(value); return value * 2; }).then(function(value){ //Second then // 2 console.log(value); }).then(function(value){ //Third then // undefined console.log(value); return Promise.resolve('resolve'); }).then(function(value){ //Fourth then // resolve console.log(value); return Promise.reject('reject'); }).then(function(value){ //Fifth then //reject:reject console.log('resolve:' + value); }, function(err) { console.log('reject:' + err); });

Метод then возвращает объект Promise в состоянии resolved или rejected для цепочки вызовов, и значением объекта Promise является это возвращаемое значение.

На что следует обратить внимание в методе then

При простом программировании цепочек Promise лучше сохранять их плоскими и избегать вложенности Promise.

Всегда помните, что нужно возвращать или завершать цепочку Promise.

const p1 = new Promise(function(resolve,reject){ resolve(1); }).then(function(result) {   p2(result).then(newResult => p3(newResult)); }).then(() => p4());

Когда вы создаёте новый Promise, но забываете вернуть его, соответствующая цепочка разрывается, из-за чего p4 продолжает выполняться одновременно с p2 и p3.

Для отклонений в цепочке Promise, которые невозможно завершить в большинстве браузеров, рекомендуется всегда добавлять.catch(error => console.log(error));


Другие статьи

Объект Promise в JavaScript