JavaScript实现promise的方法(代码示例)

本篇文章给大家带来的内容是关于php读取csv文件的方法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

let promise = new Promise((resolve111, reject) => {    //这里放入我们要执行的函数,可能是同步,也可能是异步, 这里我们就来写一个异步的执行    setTimeout(() => {        resolve111('hello');    }, 100)})    promise.then(data => {    console.log(data);    return new Promise(function(res, rej) {        setTimeout(function() {            console.log(2);            res();        }, 100)    })}, err => {console.log(err)})

登录后复制

promise的执行流程如如下:

1788886240-5c35a7107b995_articlex.png

var i = 1function Promise(fn) {    this.id = i++;    this.status = 'PENDING';    this.value = null;    this.deffered = [];    fn.call(this, this.resolve.bind(this), this.reject.bind(this))}Promise.prototype = {    constructor: Promise,    then: function(onfulfilled, onrejected) {        var obj = {            onfulfilled: onfulfilled,            onrejected: onrejected        }        obj.promise = new this.constructor(function() {});        console.log(this.status)        if (this.status === 'PENDING') {            this.deffered.push(obj);        }        console.log(this.deffered)        return obj.promise;    },    resolve: function(data) {        this.status = 'FULFILLED';        this.value = data;        this.deffered.forEach(item => {            let p = item.onfulfilled(this.value);            if (p && p.constructor === Promise) {                p.deffered = item.promise.deffered;            }        });    },    reject: function(err) {        this.status = 'REJECTED';        this.value = err;        this.deffered.forEach(item => {            let p = item.onrejected(this.value);            if (p && p.constructor === Promise) {                p.deffered = item.promise.deffered;            }        });    }}

登录后复制

then方法需要返回一个新的子Promise, 并且前后的Promise需要建立联系,才能决定他们的执行顺序。这里用id标识每个promise。

Promise链式操作中,执行顺序是如何保证的

立即学习“Java免费学习笔记(深入)”;

每个promise后面链一个对象该对象包含onfulfiled,onrejected,子promise三个属性,当父promise 状态改变完毕,执行完相应的onfulfiled/onfulfiled的时候呢,拿到子promise,在等待这个子promise状态改变,再执行相应的onfulfiled/onfulfiled。依次循环直到当前promise没有子promise

如何让异步的value在thenable函数中拿到

将resolve/reject函数和onfulfiled/onrejected放入同一个对象(promise对象)里面,resolve/reject的时候将value设置this.value=xxx。onfulfiled/onrejected执行的时候呢,onfulfiled(this.value)即可。

在这里避免头晕,解释一下,onfulfilled和onrejected指的是then里面的两个函数。

状态机制切换

如图所示,状态只能由pengding–>fulfilled,或者由pending–>rejected这样转变。

只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。就算改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。

以上就是JavaScript实现promise的方法(代码示例)的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2734572.html

(0)
上一篇 2025年3月8日 01:07:04
下一篇 2025年3月8日 01:07:10

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论