ECMAscript 6 fornece nativamente objetos Promise.
Promessa
O objeto Promise representa um evento que ocorrerá no futuro, e é usado para transmitir mensagens de operação assíncrona.É um conjunto de mecanismo de processamento de operação assíncrona.
Objetos de promessa resolvem o problema do inferno de retorno de chamada aninhado.
A função de retorno de chamada de estado resolvido e estado rejeitado são respectivamente formuladas através do método then.
1. Recursos de promessa
- Ele pode lidar com erros de maneira flexível em uma série de operações assíncronas, evitando funções de retorno de chamada aninhadas.
As promessas também têm algumas desvantagens. Em primeiro lugar, a Promessa não pode ser cancelada, uma vez criada, será executada imediatamente e não pode ser cancelada a meio. Em segundo lugar, se a função de retorno de chamada não for definida, o erro lançado dentro da Promessa não será refletido para o exterior. Terceiro, quando ele está no estado Pendente, é impossível saber em qual estágio ele está (apenas iniciado ou prestes a ser concluído).
Em segundo lugar, a criação da promessa
const promise = new Promise(function(resolve, reject) {
// ... some code
if (/* 异步操作成功 调用resolve */){
resolve(value);
} else {
/* 异步操作失败 调用reject */
reject(error);
}
});
resolve: chamado quando a operação assíncrona é bem-sucedida e passa o resultado da operação assíncrona como um parâmetro;
Rejeitar: chamado quando a operação assíncrona falha, e o erro relatado pela operação assíncrona é passado como parâmetro;
三 、 Promise.prototype.then ()
Depois que a instância Promise é gerada, você pode usar o método then (then método é definido no objeto de protótipo Promise.prototype . Sua função é adicionar uma função de retorno de chamada para a instância Promise quando o estado muda.), O método catch especifica o Estado resolvido e o estado rejeitado respectivamente Retorno de chamada:
ew Promise(function(resolve,reject) {
let num = Math.random() * 2;
console.log("产生的随机数为:" + num);
setTimeout(function () {
if(num < 1) {
console.log("执行成功");
resolve("200 OK");
} else {
console.log("执行失败");
reject("失败原因num为:" + num);
}
}, num * 1000);
}).then(function(r) {
console.log("then:" + r);
}).catch(function(j) {
console.log("catch:" + j);
});
四 、 Promise.prototype.catch ()
O método Promise.prototype.catch () é usado para especificar a função de retorno de chamada quando ocorre um erro.
const p1 = new Promise(function cb(resolve, reject) {
setTimeout(() => {
console.log('欢迎')
reject()
}, 3000)
})
p1.then(_ => {
setTimeout(() => {
console.log('谢谢光临')
}, 2000)
}).catch(_ => {
console.log('出错了')
})
Quando uma promessa gera um erro, ela é capturada pela função de retorno de chamada especificada pelo método catch ().
Se o status da promessa foi resolvido, lançar um erro novamente é inválido.
五 、 Promise.prototype.finally ()
O método finally () retorna uma promessa .
No final da promessa, quer o resultado seja cumprido ou rejeitado , a função de retorno de chamada especificada será executada. Isso fornece uma maneira de o código precisar ser executado depois que a promessa for concluída com êxito.
Isso evita a situação em que a mesma instrução precisa ser escrita uma vez em ** then () e catch () **.
p.finally(onFinally);
p.finally(function() {
// 返回状态为(resolved 或 rejected)
});
parâmetro:
- onFinalmente
- Função a ser chamada após o término da promessa.
valor de retorno:
- Retorna um objeto Promise com uma função de retorno de chamada finalmente.
六 、 Promise.all ()
O método Promise.all (iterável) retorna uma instância. Nesse caso, todas as promessas no parâmetro iterável são "resolvidas" ou o parâmetro não contém a promessa, o retorno de chamada é concluído (resolver); se uma das promessas em o parâmetro falha (rejeitado) Este retorno de chamada da instância falhou (rejeitou), o motivo da falha é o resultado da primeira promessa falhada.
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
Promise.all([promise1, promise2, promise3]).then((values) => {
console.log(values);
});
// expected output: Array [3, 42, "foo"]
Chefe de referência: https://blog.csdn.net/m0_46532221/article/details/106528918