Implementar Prométete

class MyPromise {

    constructor(func) {
        this.task = [];
        this.errTask=undefined;
        this.ball = null;
        this.status=undefined;
        setTimeout(() => {
            func(this.resolve.bind(this), this.reject.bind(this))
        }, 0)

    }
    resolve(obj) {
        
        if(this.status) return;
        this.status="resolved";
        this.ball = obj;
        console.log(this.task.length)
        this.task.forEach((func) => {
            this.ball = func(this.ball)
        })
    }
    reject(obj) {

        if(this.status) return;
        this.status="rejected";
        this.ball=obj;
   
        if(this.errTask)this.errTask(obj)
     }
    then(func,errFunc) {
        this.task.push(func);
        if(!this.errTask && errFunc) this.errTask=errFunc;
        return this;
    }
}


function fff(resolve, reject) {
 
    reject("kkk err")
    //resolve({ name: "kim" })
}
// test
var m = new MyPromise(fff)
var num=1;
m.then((obj) => { console.log(obj);num++; return { age: num } },(obj)=>console.log(obj))


   

MyPromise implementa las funciones básicas de resolución y rechazo Una vez que se establece el estado de resolución y rechazo, no se puede cambiar.

Aquí tenemos que explicar el setTimeout en el constructor:

En js, independientemente de la situación del trabajador, todo tiene un solo subproceso, pero el motor js tiene su propia cola de tareas.Durante la ejecución del programa js, algunas tareas se agregarán a la cola una por una y luego se ejecutarán en secuencia. Y setTimeout es en realidad agregar una tarea a esta cola con un cierto retraso, pero agregarla a la cola no significa que se ejecutará de inmediato, sino que tendrá que esperar hasta que finalice la ejecución de la tarea anterior. Por lo tanto, la tarea con un retraso de cero segundos aquí esperará a que se complete el programa actual (la tarea más avanzada en la cola) antes de ejecutarse. El programa actual ha llamado para agregar la función que se ejecutará a la cola de tareas de Promise, para que la resolución posterior pueda usar estas funciones.

Publicado 21 artículos originales · ganado elogios 2 · Vistas 7283

Supongo que te gusta

Origin blog.csdn.net/qq_31261131/article/details/81160204
Recomendado
Clasificación