descripción general de la promesa
introducir
Promise es una de las características importantes de ES6
La solución tradicional para la programación asíncrona es usar funciones de devolución de llamada, pero esto conducirá a un anidamiento profundo y un infierno de devolución de llamada, por lo que otra solución para prometer programación asíncrona será más poderosa.
tres estados
- estado inicial pendiente ( pendiente ), ni honrado ni rechazado
- cumplida significa que la operación se completó con éxito
- rechazado ( rechazado ) significa que la operación falló.
características
- Los objetos de Promesa pendiente se cumplen con un valor o se rechazan con un motivo (error) Cuando ocurre una de estas situaciones, alineamos el procesamiento relevante con el método de la promesa y luego se llamará al programa
Promise.prototype.then
yPromise.prototype.catch
los métodos devuelven promesas, por lo que pueden encadenarse
Métodos de promesa de tres instancias
entonces() método
- entonces es la función de devolución de llamada cuando cambia el estado de la instancia, el primer parámetro es la función de devolución de llamada del estado resuelto y el segundo parámetro es la función de devolución de llamada del estado rechazado
- El método then devuelve una nueva instancia de Promise, por lo que las promesas se pueden escribir en cadenas.
promise.then(result => {
···})
método de captura
Cuando ocurre una excepción, se requiere el método catch para capturarla.
promise.then(result => {
···}).catch(error => {
···})
método finalmente()
El método se utiliza para especificar la operación que se realizará independientemente del estado final del objeto Promise
promise.then(result => {
···}).catch(error => {
···}).finally(() => {
···});
método estático de promesa
método de resolución
El método devuelve un objeto analizado con el valor dado. El valor dado tiene las siguientes situaciones:Promise
- Si el valor es una promesa, se devolverá la promesa.
- El parámetro no es un objeto con un método then(), o no es un objeto en absoluto, Promise.resolve() devolverá un nuevo objeto Promise con un estado de resuelto
- Cuando no hay ningún parámetro, devuelve directamente un objeto Promise en estado resuelto
rechazar () método
El método Promise.reject(motivo) también devuelve una nueva instancia de Promise cuyo estado es rechazado
const p = Promise.reject('出错了')
等同于
const p = new Promise((resolve, reject) => reject('出错了'))
p.then(null, function (s) {
console.log(s)})
//出错了Promise.reject()方法的参数,会原封不动地变成后续方法的参数
cualquier () método
Toma un Promise
objeto iterable, y tan pronto como uno de ellos promise
tiene éxito , devuelve el que ha tenido éxito promise
. Si ninguno de los iterables promise
tiene éxito (es decir, promises
todos fallan/rechazan), devuelve promise
una AggregateError
instancia del tipo y falla, que es una Error
subclase y se usa para agrupar errores individuales. Esencialmente, este enfoque Promise.all()
es el opuesto.
const pErr = new Promise((resolve, reject) => {
reject("总是失败");
});
const pSlow = new Promise((resolve, reject) => {
setTimeout(resolve, 500, "最终完成");
});
const pFast = new Promise((resolve, reject) => {
setTimeout(resolve, 100, "很快完成");
});
Promise.any([pErr, pSlow, pFast]).then((value) => {
console.log(value);
// pFast fulfils first
})
Método todo()
-
El método recibe la entrada de un tipo iterable de promesa (Nota: Array, Map y Set pertenecen al tipo iterable ES6) y devuelve solo una
Promise
instanciaconst p = Promise.all([p1, p2, p3]);
El estado de instancia p está determinado por p1, p2, p3, que se puede dividir en dos casos:
- Solo cuando se cumplan los estados de p1, p2 y p3, se cumplirá el estado de p. En este momento, los valores devueltos de p1, p2 y p3 forman una matriz y la pasan a la función de devolución de llamada de p .
- Siempre que se rechace uno de p1, p2 y p3, el estado de p se rechaza y el valor de retorno de la primera instancia rechazada se pasará a la función de devolución de llamada de p
método allSettled
Promise.all entrará en estado fallido cuando falle cualquier solicitud
Dado que una sola Promesa ingresa al estado rechazado, el resultado de Promise.all() ingresará inmediatamente al estado rechazado, de modo que al ingresar al estado rechazado a través de Promise.all(), la Promesa de origen aún puede estar en estado pendiente, por lo que que todas las Promesas no se pueden obtener El tiempo de cumplimiento.
El método estático Promise.allSettled() esperará a que todas las Promesas de origen entren en el estado cumplido o rechazado, para garantizar que no haya conflictos de tiempo.
método de carrera
Este método también envuelve múltiples instancias de Promise en una nueva instancia de Promise
const p = Promise.race([p1, p2, p3]);
- Siempre que una instancia entre p1, p2 y p3 cambie de estado primero, el estado de p cambiará en consecuencia
- El valor de retorno de la primera instancia de Promise cambiada se pasa a la función de devolución de llamada de p
Azúcar sintáctico Async/Await
Promise
Azúcar sintáctico agregado en ES8 async await
para manejar la asincronía con más gracia.
async
Puede existir solo, y la función declarada con esta palabra clave devuelve un objeto Promesa.
async funtion add(){
return 1
}
add()
add() instanceof Promise // true
await
No puede existir solo, debe usarse async
en conjunto.
function sub() {
await 1
}
// 这个方法定义就不满足语法的,会如下报错
// Uncaught SyntaxError: await is only valid in async function
async
await
Haga que el procesamiento asíncrono sea más elegante
let fs = require('fs')
var gen = async function() {
const f1= await readFile('files/a.txt');//封装一个promise对象
console.log(f1)
const f2= await readFile('files/b.txt');
console.log(f2)
const f3= await readFile('files/c.txt');
console.log(f3)
};
var readFile=function(path){
return new Promise((resolve,reject)=>{
fs.readFile(path,'utf-8',function(err,data){
if(!err){
resolve(data)
}else{
reject(err)
}
});
})
}
var obj = gen();