promise实现原理代码

//Promise实现原理

// 实例方法
// then
// catch
// new P( 函数 ).then(functon(){}).then(function(){})
// let p = new MyPromise();
// p.resolve(); //不允许的

// 静态方法
// all
// race

// 属性
// status :  pending / resolved / rejected
// resolve / reject

// 要求, 每个promise对象, status状态初始为pending
// 该属性不可直接修改,只能通过回调 修改
// 并且,状态一旦被修改, 不可逆.
// 执行目标函数时, 需要传参数, resolve, reject

function MyPromise(main){
    let status = "pending";  //MyPromise刚被创建的初始化状态
    let listTask = [];  //定义一个数组,用于存储.then()里函数
    let exceptionHander = null; //用于捕捉错误
    function resolve(msg){  //如果函数返回resolve()方法则调用
        if(status == "pending"){    //如果状态为pending则执行,否则不执行,程序结束
            status = "resolve";     //函数顺利执行完将promise状态改为resolve
            let next = listTask.shift();    //拿出数组中第一个
            let newp = next(msg);
            if(newp instanceof MyPromise){ //如果拿出来函数也new MyPromise,则执行
                listTask.forEach(t=>{
                    newp.then(t);   //例 new MyPromise(ajaxB).then(function(){ return new MyPromise(ajaxC)}).then(ajaxD).catch(function(e){console.log(e)})
                })
            }
        }
    }
    function rejected(msg){   //如果返回rejected,执行此函数
        if(status == "pending"){//如果当前MyPromise状态为pending
            status = "rejected";    //更改状态为rejected ,抛出异常,输出方法里的msg
            if(exceptionHander){  //有catch则调用,否则报错
            }else{
                exceptionHander(msg);
            }
        }
    }
    this.then = function(task){ //讲第一个new Promise后面所有.then加入listTask数组里
        console.log(this);
        listTask.push(task);
        return this;    //返回,循环加入
    },
    this.catch = function(fn){
        exceptionHander = fn;
    }
    this.getStatus = function(){
        return status;
    }

        main(resolve,rejected.bind(this));//给第一个函数两个参,函数也需要设置两个参数接收,否则报错
} 

MyPromise.all = function(args){
    let count = 0;
    let task = null;
    function isOver(){
        count++;
        if(count == args.length) task();
    }
    args.forEach(p=>{
        p.then(isOver);
    })

    return then(fn){
        task = fn;
    }
}

测试以上

  <script src="Promise.js"></script>
    <!-- <script src="原生JS实现Promise.js"></script> -->
    <script>

        function ajaxA(resolve,reject){
            console.log("ajaxA start!");
                setTimeout(()=>{
                    console.log("ajaxA end!");
                    resolve();
                },Math.random()*2000)
        }

        function ajaxB(resolve,reject){
            console.log("ajaxB start!");
                setTimeout(()=>{
                console.log("ajaxB end!");
                resolve();
            },Math.random()*2000)
        }
        function ajaxC(resolve,reject){
            console.log("ajaxC start!");
                setTimeout(()=>{
                    console.log("ajaxC end!");
                    reject("iii");
                },Math.random()*2000)
        }

        new MyPromise(ajaxA).then(function(){
            return new MyPromise(ajaxB);
        }).then(ajaxC).catch(function(e){
            console.log(e);
        })

    </script>

//Promise实现原理

// 实例方法

// then

// catch

// new P( 函数 ).then(functon(){}).then(function(){})

// let p = new MyPromise();

// p.resolve(); //不允许的

// 静态方法

// all

// race

// 属性

// status : pending / resolved / rejected

// resolve / reject

// 要求, 每个promise对象, status状态初始为pending

// 该属性不可直接修改,只能通过回调 修改

// 并且,状态一旦被修改, 不可逆.

// 执行目标函数时, 需要传参数, resolve, reject

function MyPromise(main){

let status = "pending"; //MyPromise刚被创建的初始化状态

let listTask = []; //定义一个数组,用于存储.then()里函数

let exceptionHander = null; //用于捕捉错误

function resolve(msg){ //如果函数返回resolve()方法则调用

if(status == "pending"){ //如果状态为pending则执行,否则不执行,程序结束

status = "resolve"; //函数顺利执行完将promise状态改为resolve

let next = listTask.shift(); //拿出数组中第一个

let newp = next(msg);

if(newp instanceof MyPromise){ //如果拿出来函数也new MyPromise,则执行

listTask.forEach(t=>{

newp.then(t); //例 new MyPromise(ajaxB).then(function(){ return new MyPromise(ajaxC)}).then(ajaxD).catch(function(e){console.log(e)})

})

}

}

}

function rejected(msg){ //如果返回rejected,执行此函数

if(status == "pending"){//如果当前MyPromise状态为pending

status = "rejected"; //更改状态为rejected ,抛出异常,输出方法里的msg

if(exceptionHander){ //有catch则调用,否则报错

}else{

exceptionHander(msg);

}

}

}

this.then = function(task){ //讲第一个new Promise后面所有.then加入listTask数组里

console.log(this);

listTask.push(task);

return this; //返回,循环加入

},

this.catch = function(fn){

exceptionHander = fn;

}

this.getStatus = function(){

return status;

}

main(resolve,rejected.bind(this));//给第一个函数两个参,函数也需要设置两个参数接收,否则报错

}

MyPromise.all = function(args){

let count = 0;

let task = null;

function isOver(){

count++;

if(count == args.length) task();

}

args.forEach(p=>{

p.then(isOver);

})

return then(fn){

task = fn;

}

}

原文地址:https://www.cnblogs.com/kongVv/p/11391184.html

时间: 2024-09-30 16:51:01

promise实现原理代码的相关文章

Promise实现原理

这两天在熟悉 kissy框架的时候,看到了 Promise 模块. Promise 对于一个Jser并不陌生, Promise 类似于一个事务管理器,它的作用就是将各种内嵌回调的事务用流水形式表达.利用 Promise 可以让异步编程更符合人的直觉,让代码逻辑更加清晰,把开发人员从回调地狱中释放出来.这么“高大上”的东西,以前写 nodejs 代码的时候只是简单的用用,还没有理解其基本的实现原理,罪过!个人认为,理解编程思想最好的途径就是阅读一份简易的实现源码.很幸运,网上有不少 Promise

学习Promise实现原理(附源码)

本篇文章主要在于探究 Promise 的实现原理,带领大家一步一步实现一个 Promise , 不对其用法做说明,如果读者还对Promise的用法不了解,可以查看阮一峰老师的ES6 Promise教程. 1. Promise 基本结构 new Promise((resolve, reject) => { setTimeout(() => { resolve('FULFILLED') }, 1000) }) 构造函数Promise必须接受一个函数作为参数,我们称该函数为handle,handle

Promise核心原理解析

作者: HerryLo 本文永久有效链接: https://github.com/AttemptWeb...... Promises对象被用于表示一个异步操作的最终完成 (或失败), 及其结果值.主要是为了解决异步操作的问题. #Promise对象的状态 一个 Promise对象有以下三种状态: pending: 初始状态,既不是成功,也不是失败状态. fulfilled(resolved): 意味着操作成功完成. rejected: 意味着操作失败. Promise对象内部运行的一个变化, 变

PHP 弹出文件下载 原理 代码

/** * @author default7<[email protected]> * @description 演示PHP弹出下载的原理 * * @param $file_name */ function downFile($file_name) { $file_path = "/tmp/" . $file_name; $buffer = 102400; //一次返回102400个字节 if (!file_exists($file_path)) { echo "

Node.js(十三)——Promise重构爬虫代码

在重构代码之前,先要了解下什么是https? https协议:基于ssl/tls的http协议,所有的数据都是在 ssl/tls协议的封装之上传输的,也就是说https协议是在http协议基础上 添加了ssl/tls握手以及数据加密传输,因此这就是两者之间最大的区别. https模块专门处理加密访问的,区别在于搭建https服务器的时候需要有ssl证书. 模拟搭建https服务器 var https = require('https') var fs = require('fs')//文件系统模

使用ES6 +Promise组织异步代码

(1)为什么要使用promise这种设计模式,这种设计模式的好处是什么 解决 JavaScript 异步事件的传统方式是回调函数:调用一个方法,然后给它一个函数引用,当这个方法完结的时候执行这个函数引用. Javascript 中的神器--Promise Promise in js 回调函数真正的问题在于他剥夺了我们使用 return 和 throw 这些关键字的能力.而 Promise 很好地解决了这一切. 2015 年 6 月,ECMAScript 6 的正式版 终于发布了. ECMAScr

reduce + Promise 顺序执行代码

下午的太阳晒得昏昏沉沉,和上周五一样迷糊,看一段代码半天没看明白,刚才不知不觉眯了几分钟,醒来后再看就醒悟了. 这段代码先加载story.json文件,然后依次加载story.chapterUrls数组中的url.看半天一直没搞明白为啥是顺序的,原因是每个reduce执行的function本身就构造了first - next的顺序结构,而Promise的then又保证了代码的顺序执行,即reduce把多个then串起来生成了一长串then. getJson('story.json').then(

Python盗号原理-代码实现截屏键盘记录远程发送(不要做坏事)

这年头盗号的从出不穷,不是脱裤就是社工钓鱼.今天呢我们就以前面的几篇技术文章做铺垫,来讲一下python盗号的原理(学习用途,请勿用于违法犯罪),知己知彼方能百战不殆嘛. 脱裤我们就不多提了,无非就是过滤不严谨导致的sql注入,或者数据库存储不安全,这个本篇文章暂且不说,当然有感兴趣的,我后面的文章或许也会讲讲. 最简单的,也是技术手段相对较低的盗号方式当属钓鱼了(当然,社工更考验心理),除了钓鱼网站,就是发布某些带有诱惑性的工具,诱导消费者下载,运行后开启后门,或者启用钩子进行键盘记录.本篇文

promise的原理及面试题

const promise = new Promise((resolve, reject) => { console.log(1); resolve(); console.log(2); }) promise.then(() => { console.log(3); }) console.log(4);以上输出结果为1243首先Promise新建后立即执行,所以会先输出1,2,而Promise.then()内部的代码在当次事件循环的结尾立即执行,所以会先输出4,最后输出3. 原文地址:http