Promesa del Capítulo 20 de JavaScript

Promesa

  • Promise es una clase proporcionada por ES6. Es una solución para la programación asincrónica. No se refiere a un método de conversión de asincrónico a sincrónico . El propósito es escribir tareas asincrónicas complejas de manera más elegante.

ventaja

1. El estado del sujeto no se ve afectado por el mundo exterior

  • Tres estados
    pendientes: en progreso
    cumplido: rechazado con éxito:
    fallido
    Promesa significa promesa, ¿qué significa promesa? Es decir, solo el resultado de la operación asincrónica puede determinar el estado actual, y ninguna otra operación puede cambiar este estado.

2. Una vez que se cambia el estado, no volverá a cambiar y el resultado se puede obtener en cualquier momento

  • Solo hay dos casos para el cambio de estado de la Promesa: pendiente a cumplida y pendiente a rechazar
  • Mientras ocurran estas dos situaciones, el estado no cambiará y el resultado siempre se mantendrá. En este momento, se llama resuelto (finalizado), y este resultado se puede obtener agregando una función de devolución de llamada al objeto Promise ( a diferencia de los eventos, eventos Si te lo pierdes y vuelves a escuchar, no obtendrás ningún resultado)

Desventaja

1. La promesa no se puede cancelar

  • Una vez creado, debe ejecutarse inmediatamente y no se puede cancelar a la mitad.

2. Juicio incorrecto

  • Si la función de devolución de llamada no está configurada, el error arrojado dentro de la Promesa no se reflejará en el exterior

3. Estado impredecible

  • Cuando está en estado pendiente, es imposible saber a qué estado está progresando actualmente, si acaba de comenzar o está a punto de completarse.

Uno, construir Promesa

  • gramática
new Promise(function (resolve, reject) {
    
    
    // to do...
});
  • El constructor Promise tiene solo un parámetro, que es una función . Esta función se ejecutará de forma asincrónica directamente después de la construcción, por lo que la llamamos función de inicio. La función de inicio contiene dos parámetros: resolver y rechazar. Cuando se construye la Promesa, la función de inicio se ejecutará de forma asincrónica
  • Tanto resolver como rechazar son funciones (proporcionadas por el motor de JavaScript, no es necesario que las implemente usted mismo), en las que resolver significa que todo es normal, es decir, se llama cuando la función asincrónica se opera con éxito, y el resultado de la operación asincrónica se pasa como un parámetro y el rechazo es cuando ocurre una excepción La llamada se llama cuando falla la operación asincrónica y el error reportado por la operación asincrónica se pasa como un parámetro
  • Puede colocar un parámetro en resolve () para pasar un valor al siguiente then, y la función en then también puede devolver un valor para pasar a then, pero si lo que se devuelve en then es un objeto Promise, entonces el siguiente entonces será Ser equivalente Operar en la Promesa devuelta
  • El parámetro de rechazo () generalmente pasa una excepción a la función de captura posterior para manejar la excepción
  • El alcance de resolver y rechazar es solo la función inicial, excluyendo entonces y otras secuencias
  • resolver y rechazar no puede detener la función de inicio, debe usar return

Dos, método de promesa

1. luego ()

  • entonces () puede agregar la función en el parámetro a la secuencia de ejecución normal de la Promesa actual
  • La función pasada en then () se ejecutará en secuencia, y cualquier excepción saltará directamente a la secuencia de captura
  • Cómo interrumpir el bloque then: El bloque then se ejecutará en orden descendente de forma predeterminada, el retorno no se puede interrumpir y se puede interrumpir saltando para atrapar lanzando
  • El bloque then se puede usar varias veces, pero el bloque catch solo ejecutará el primero a menos que haya una excepción en el bloque catch, por lo que es mejor organizar solo un catch y finalmente bloquear
  • Cuando necesitamos llamar a una tarea asincrónica, necesitamos escribir otro entonces en lugar de programar en el entonces actual

2. atrapar ()

  • catch () es para establecer la secuencia de manejo de excepciones de Promise

3. finalmente ()

  • finalmente () es una secuencia que debe ejecutarse al final de la ejecución de la Promesa
  • La secuencia de entonces, captura y finalmente se puede invertir, pero esto no es recomendable. Es mejor escribir el programa en el orden de entonces-captura-finalmente

Tres, función cascada

  • El programa implementado con "función cascada" es un asunto particularmente engorroso para el mantenimiento o manejo de excepciones, y hará que el formato de sangría sea muy redundante.
  • Por ejemplo
setTimeout(function () {
    
    
    console.log("l");
    setTimeout(function () {
    
    
        console.log("z");
        setTimeout(function () {
    
    
            console.log("j");
        }, 3000);
    }, 2000);
}, 1000);

Cuarto, use Promise para mejorar

  • Con el objeto Promise, podemos expresar operaciones asincrónicas en un proceso de operación síncrona, evitando así funciones de devolución de llamada anidadas. Además, el objeto Promise proporciona una interfaz unificada, lo que facilita el control de operaciones asincrónicas
  • Mejora inicial
new Promise(function (resolve, reject) {
    
    
    setTimeout(function () {
    
    
        console.log("l");
        resolve();
    }, 1000);
}).then(function () {
    
    
    return new Promise(function (resolve, reject) {
    
    
        setTimeout(function () {
    
    
            console.log("z");
            resolve();
        }, 2000);
    });
}).then(function () {
    
    
    setTimeout(function () {
    
    
        console.log("j");
    }, 3000);
});
  • Mejora final
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>promiseTest</title>
    <script>
        /*冗余*/
        // setTimeout(function () {
    
    
        //     console.log("m");
        //     setTimeout(function () {
    
    
        //         console.log("a");
        //         setTimeout(function () {
    
    
        //             console.log("y");
        //         },3000)
        //     },2000)
        // },1000)

        /*初步改进*/
        // resolve 代表一切正常,reject 是出现异常时所调用的
        // new Promise(function (resolve, reject) {
    
    
        //     setTimeout(function () {
    
    
        //         console.log("m");
        //         resolve();
        //     }, 1000);
        // }).then(function () {
    
    
        //     return new Promise(function (resolve, reject) {
    
    
        //         setTimeout(function () {
    
    
        //             console.log("a");
        //             resolve();
        //         }, 2000);
        //     });
        // }).then(function () {
    
    
        //     setTimeout(function () {
    
    
        //         console.log("y");
        //     }, 3000);
        // });

        /*最终优化*/
        // 使用 Promise 函数
        function print(delay, message) {
    
    
            // must write return(to return Promise object)
          return new Promise(function (resolve, reject) {
    
    
                setTimeout(function () {
    
    
                    console.log(message);
                    resolve();
                }, delay);
            });
        }
		
		// 实例
        print(1000,"m").then(function (){
    
    
            return print(2000,"a");
        }).then(function () {
    
    
            print(3000,"y"); // 对上面返回的Promise对象进行操作
        })

    </script>
</head>
<body>
    
</body>
</html>

Cinco, función asíncrona (función asíncrona)

  • Una función asincrónica es una función que se ejecuta de forma asincrónica a través de un bucle de eventos y devuelve una Promesa implícita como resultado.
  • gramática
async function name([param[, param[, ... param]]]) {
    
     statements }

1. Utilice funciones asincrónicas para optimizar ejemplos

async function asyncFunc() {
    
    
    await print(1000, "m");
    await print(4000, "a");
    await print(3000, "y");
}
asyncFunc();
  • La instrucción de espera se puede utilizar en la función asíncrona función asíncrona. La instrucción de espera debe ir seguida de una Promesa . La función asíncrona se detendrá durante la operación de la Promesa y continuará ejecutándose hasta el final de su operación. Es decir, el await La instrucción suspende la ejecución de la función asíncrona y espera la ejecución de la Promesa. Se devuelve el resultado. Una vez que se devuelve el resultado, se reanuda la ejecución de la función asíncrona y la instrucción de espera solo es válida en funciones asíncronas. Si se utiliza fuera de la función asincrónica, se producirá un error de sintaxis

2. El bloque try-catch maneja excepciones.

  • Devuelve un objeto de promesa y devuelve el valor de la función asincrónica (si la función asincrónica es resolver, devuelve el valor de la resolución; si se lanza una excepción, lanza la excepción de rechazo declarada en la función asincrónica)
async function testA(){
    
    
    try {
    
    
        await new Promise(function (resolve, reject) {
    
    
            reject("may");
        })
    } catch (e) {
    
    
        console.log(e);
    }
}
testA();

// 返回正常值
async function test(){
    
    
    let t = await new Promise(function (resolve, reject) {
    
    
        resolve("day");
    })
    console.log(t);
}
test();

Supongo que te gusta

Origin blog.csdn.net/LvJzzZ/article/details/109264225
Recomendado
Clasificación