当前位置: 首页 > 面试题库 >

promise的定义与 的具体实现?

姜鸿
2023-03-14
本文向大家介绍promise的定义与 的具体实现?相关面试题,主要包含被问及promise的定义与 的具体实现?时的应答技巧和注意事项,需要的朋友参考一下

参考回答:

 

Promise对象是CommonJS工作组提出的一种规范,目的是为异步编程提供统一接口。每一个异步任务返回一个Promise对象,该对象有一个then方法,允许指定回调函数。

f1().then(f2);

一个promise可能有三种状态:等待(pending)、已完成(resolved,又称fulfilled)、已拒绝(rejected)。

promise必须实现then方法(可以说,then就是promise的核心),而且then必须返回一个promise,同一个promise的then可以调用多次,并且回调的执行顺序跟它们被定义时的顺序一致。

then方法接受两个参数,第一个参数是成功时的回调,在promise由“等待”态转换到“完成”态时调用,另一个是失败时的回调,在promise由“等待”态转换到“拒绝”态时调用。同时,then可以接受另一个promise传入,也接受一个“类then”的对象或方法,即thenable对象。

Promise实现如下

function Promise(fn) {
    var state = 'pending',
    value = null,
    callbacks = [];
    this.then = function (onFulfilled, onRejected) {
    return new Promise(function (resolve, reject) {
    handle({
    onFulfilled: onFulfilled || null,
    onRejected: onRejected || null,
    resolve: resolve,
    reject: reject
    });
    });
    };
    function handle(callback) {
    if (state === 'pending') {
    callbacks.push(callback);
    return;
    }
    var cb = state === 'fulfilled' ? callback.onFulfilled : callback.onRejected,
    ret;
    if (cb === null) {
    cb = state === 'fulfilled' ? callback.resolve : callback.reject;
    cb(value);
    return;
    }
    ret = cb(value);
    callback.resolve(ret);
    }
    function resolve(newValue) {
    if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {
    var then = newValue.then;
    if (typeof then === 'function') {
    then.call(newValue, resolve, reject);
    return;
    }
    }
    state = 'fulfilled';
    value = newValue;
    execute();
    }
    function reject(reason) {
    state = 'rejected';
    value = reason;
    execute();
    }
    function execute() {
    setTimeout(function () {
    callbacks.forEach(function (callback) {
    handle(callback);
    });
    }, 0);
    }
    fn(resolve, reject);
}

 

 类似资料:
  • 问题内容: 我在上配置了,用于访问包含复合ID的实体: 例如,当我访问服务器时,我以json的形式返回了正确的资源,但是_links部分中针对self的href是错误的,并且对于我查询的任何其他客户也是相同的: 即: 我想这是因为我的复合ID,但是我对如何更改此默认行为感到烦恼。 我看过和类,但不确定是否需要更改多少才能解决此问题。 问题答案: 不幸的是,所有Spring Data JPA / R

  • 问题内容: 这是我的http服务器: 我需要在myHander内部访问实例t1。 有什么办法吗? 谢谢! 问题答案: 有一种方法可以将属性设置为class: 您必须注意,在所有使用myHandler的地方都将是t1的相同实例

  • 在这个网络项目中,我使用了Hibernate和jersey,这两个元素与Jackson一起使用。对于Hibernate,我有3个实体类,它们反映了数据库表的结构,并且具有“一对多”和“多对一”关系。绑定字段被注释为和。这些类的对象必须用json序列化。为了避免序列化过程中出现错误,绑定字段还被注释为和。由于类对象的序列化,结果如下: 它不适合我,我决定编写自定义序列化程序。因此,我希望看到以下js

  • 我如何在Azure功能中接受自定义媒体类型(通过HTTP触发器)?如果有必要的话,我使用的是函数v2和持久函数扩展(1.4)以及C#。 我读过关于Web API的自定义媒体类型格式化程序的文章,但没有找到任何关于WebJobs/函数的类似建议。

  • 我在两个实体之间有双向或父/子关系: 我要选择没有的所有或的属性设置为的。 我使用的是。

  • 我有这个实体类: 我有这个Web服务类: 当我尝试启动服务时,会显示此错误: 我无法编辑BaseEntity类。有没有一种方法可以在不注释BaseEntity类的情况下创建Web服务? 我不想使用MOXy框架,因为我已经在线使用了Web服务。我的想法是,如果我只能封送客户类,而不能封送她的BaseEntity类。附加信息:我的客户机和我的Web服务可以访问Customer类所在的同一个包。