О обещании! Вы все понимаете?

Promise - это просто контейнер, в котором хранится результат события (обычно асинхронной операции), которое закончится в будущем. Говоря синтаксически, Promise - это объект, который может получать сообщения от асинхронных операций; Promise предоставляет унифицированный API, и различные асинхронные операции могут обрабатываться таким же образом. Скопировать код

1. Объекты обещания имеют две основные характеристики:

1) На состояние объекта не влияет внешний мир. Объект Promise представляет асинхронную операцию. Есть три состояния: ожидает (выполняется), выполнено (успешно) и отклонено (не удалось). Только результат асинхронной операции может определить текущее состояние, и никакая другая операция не может изменить это состояние. 
2) Как только состояние изменится, оно больше не изменится, и этот результат можно получить в любой момент. Есть только две возможности для изменения состояния объекта Promise: с ожидающего на выполненное и с ожидающего на отклоненное. Пока возникают эти две ситуации, состояние будет заморожено и больше не изменится, и этот результат всегда будет поддерживаться.В это время он называется разрешенным (завершенным). Если изменение произошло, и вы добавили функцию обратного вызова к объекту Promise, вы получите этот результат немедленно. Это полностью отличается от события. Событие характерно тем, что если вы его пропустите, вы можете его прослушать и не получите результатов. Скопировать код

2. Обещаем недостатки:

1) Обещание не может быть отменено. Как только оно создано, оно будет выполнено немедленно и не может быть отменено на полпути; 
2) Если функция обратного вызова не установлена, ошибки, возникшие внутри обещания, не будут отражены извне. 
3) Когда он находится в состоянии ожидания, невозможно узнать, на каком этапе он находится в данный момент (только что запущен или вот-вот будет завершен). Скопировать код

3. Обещание использования:

1) Объект Promise - это конструктор для создания экземпляров Promise;

const KKBpromise = new Promise (function (resolve, reject) { 
  // ... некоторый код, 

  если (/ * асинхронная операция выполнена успешно * /) { 
    resolve (value); 
  } else { 
    reject (error); 
  } 
});

Конструктор Promise принимает функцию в качестве параметра, а два параметра функции - разрешение и отклонение. Это две функции, предоставляемые движком JavaScript, поэтому вам не нужно развертывать их самостоятельно.

Функция функции разрешения состоит в том, чтобы изменить состояние объекта Promise с «незавершенного» на «успешное» (то есть с ожидающего на разрешенное), вызываемого, когда асинхронная операция завершается успешно, и передать результат асинхронной операции в качестве параметра; отклонить Функция функции состоит в том, чтобы изменить состояние объекта Promise с «незавершенного» на «неудачное» (то есть с ожидающего на отклоненное), вызываемого при сбое асинхронной операции, и передать ошибку, сообщенную асинхронной операцией, в качестве параметра.

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

KKBpromise.then (функция (значение) { 
  // успех 
}, функция (ошибка) { 
  // сбой 
}); 复制 代码

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

функция профи (мс) { 
  вернуть новое обещание ((разрешить, отклонить) => { 
    setTimeout (решить, мс, 'готово'); 
  }); 
} 
pros (100) .then ((значение) => { 
  console.log (значение); 
}); 复制 代码

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

2) Обещание будет выполнено сразу после его создания. например:

пусть обещание = новое обещание (функция (разрешить, отклонить) { 
  console.log ('Pro'); 
  resolve (); 
}); 
обещание.then (функция () { 
  console.log ('разрешено'); 
}); 
console.log ('Привет, обещание!'); 
// Pro 
// Привет, обещание! 
// разрешено 复制 代码

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

Иногда после вызова метода resolve или reject миссия Promise завершается. Последующие операции должны быть помещены в метод then и не должны записываться непосредственно после определения или отклонения. Поэтому лучше всего добавить перед ними оператор return, чтобы не было сюрпризов.

new Promise ((resolve, reject) => { 
  return resolve (1); 
  // Следующий оператор не будет выполняться 
  console.log ('Следующее выполнение'); 
})

4. Обещайте часто используемые API:

1) Метод Promise.all () возвращает новый объект обещания, который инициирует успех, когда все объекты обещания завершаются успешно, и как только любой из объектов обещания в нем терпит неудачу, сбой объекта обещания будет немедленно инициирован . После того, как этот новый объект обещания инициирует состояние успеха, он примет массив, содержащий все возвращаемые значения обещания, в качестве возвращаемого значения обратного вызова успеха. Порядок соответствует порядку параметров; если этот новый объект обещания вызывает состояние сбоя, он будет Сообщение об ошибке первого объекта обещания, которое вызвало сбой, используется как его сообщение об ошибке сбоя. Метод Promise.all часто используется для обработки коллекции состояний нескольких объектов обещания.

let kkb1 = new Promise ((resolve, reject) => { 
 resolve ('kkb1') 
}) 

let kkb2 = new Promise ((resolve, reject) => { 
 resolve ('kkb2') 
}) 

let kkb3 = Promse.reject ('Failed') 


Promise.all ([kkb1, kkb2]) 
 .then ((result) => { 
   console.log (result) // ['успешный kkb1', 'успешный kkb2'] 
 } ) 
 .catch ((error) => { 
   console.log (error) 
 }) 


Promise.all ([kkb1, kkb3, kkb2]) 
 .then ((результат) => { 
   console.log (результат) 
 }) 
 .catch ( (error) => { 
   console.log (error) // 'Failed' 
 })

2) Использование Promise.race аналогично использованию race и всем остальным. Метод Promse.race, как следует из его названия, означает гонку, что означает, что если результат в Promise.race ([kkb1, kkb2, kkb3]) будет получен быстро, этот результат будет возвращен, независимо от того, является ли сам результат состоянием успеха или состоянием отказа.

let kkb1 = new Promise ((разрешить, отклонить) => { 
  setTimeout (() => { 
    resolve ('kkb1') 
  }, 1000) 
}) 
 
let kkb2 = new Promise ((разрешить, отклонить) => { 
  setTimeout (( ) => { 
    reject ('kkb2') 
  }, 500) 
}) 
 
 
Promise.race ([kkb1, kb2]) 
  .then ((результат) => { 
    console.log (результат) 
  }). catch ((error) = > { 
    console.log (error) // распечатать kkb2, потому что он быстрый 
  })

рекомендация

отblog.51cto.com/15069732/2575865