你对诺言了解多少?

小夏 健康 更新 2024-02-24

Promise 是一种异步编程解决方案,它比传统解决方案(函数和事件)更有意义且更健壮。 它最初是由社区提出并实现的,ES6 已经将其写入语言标准,统一了用法,并原生提供了 promise 对象。

Promise 对象有两个特征。

(1)物体的状态不受外界影响。

promise 对象表示异步操作有三种状态:待处理、已解决(也称为已履行)和拒绝。只有异步操作的结果才能确定它所处的状态,没有其他操作可以更改此状态。 这就是“promise”这个名字的由来,在英语中是“promise”的意思,意思是不能通过其他方式改变。

(2)状态一旦改变,就不会再改变,这个结果可以随时得到。

promise 对象只有两种可能性:从挂起到已解决,从挂起到拒绝。只要这两种情况发生,状态就会固化,不会再改变,并且会一直保持这个结果。 即使更改已经发生,您也可以向 promise 对象添加一个函数,您将立即得到此结果。 这与事件完全不同,事件的特点是,如果你错过了它并听了它,你就不会得到结果。

使用 promise 对象,您可以在同步操作流中表示异步操作,从而避免嵌套函数层。 此外,promise 对象提供了一个统一的接口,可以更轻松地控制异步操作。

承诺也有一些缺点。 首先,一个承诺是不能取消的,一旦有了新的承诺,就会立即执行,不能半途而废。 其次,如果不设置 ** 函数,promise 内部抛出的错误不会反映到外部。 第三,当处于待处理状态时,没有办法知道你目前处于哪个阶段(刚刚开始或即将结束)。

示例 1:基本用法。

var promise = new promise(function(resolve, reject) else }
示例 2:一旦做出新的承诺,它将立即执行。

let promise = new promise(function(resolve, reject) )promise.then(function() console.log('hi!'); // promise // hi! // resolved
示例 3:下面是使用 promise 对象实现的 AJAX 操作的示例。 (非常经典)。

var getjson = function (url) if (this.status === 200) else }return promise; }getjson("/posts.json").then(function (json) ,function (error) )
promise 实例有一个 then 方法,即 then 方法在原型对象 promise 中定义原型。 它的作用是在状态更改时向 promise 实例添加一个函数。 如前所述,then 方法的第一个参数是已解析状态的函数,第二个参数(可选)是被拒绝状态的函数。

then 方法返回一个新的 promise 实例(请注意,它不是原始 promise 实例)。 因此,您可以使用链式方法,其中 then 方法后面跟着另一个 then 方法。

getjson("/posts.json").then(function(json) )then(function(post) )
使用 chained then,可以指定一组按顺序调用的函数。 在这种情况下,前一个函数可能仍会返回一个 promise 对象(即存在异步操作),而后一个函数将等待 promise 对象的状态发生变化后再调用。

getjson("/post/1.json").then(function (post) )then(function funca(comments) ,function funcb(err) )
在上面的第一个 then 方法中,第一个 then 方法指定的函数返回另一个 promise 对象。 在本例中,第二个 then 方法指定一个函数,该函数等待新 promise 对象的状态发生更改。 如果它被解析,它调用 funca,如果状态变为 rejected,则调用 funcb。

promise.prototype.catch 方法是。 then(null, rejection) 指定发生错误时的 ** 函数。

例:

getjson("/posts.json").then(function (posts) )catch(function (error) )
与传统的 try catch 块不同,如果没有使用 catch 方法指定错误处理的函数,promise 对象抛出的错误不会传递到外层,即不会有任何反应。

var someasyncthing = function ()someasyncthing().then(function ()
promise.all 方法用于将多个 promise 实例包装到一个新的 promise 实例中。

var p = promise.all([p1, p2, p3]);

以上,承诺all 方法接受数组作为参数,p1、p2 和 p3 都是 promise 对象的实例。

例:

promise.all([checklogin(),getuserinfo()]then(([res1,res2])=>, result2:$`
promise.race(iterable) 方法返回一个 promise,一旦迭代器中的承诺被解析或拒绝,该 promise 就会被解析或拒绝。

有时你需要将一个现有的对象转换为一个 promise 对象,一个 promise这就是 resolve 方法的用武之地。

var jspromise = promise.resolve($.ajax('/whatever.json'));
promise.reject(reason) 方法还返回一个状态为 rejected 的新 promise 实例。 它的论点与承诺的使用方式相同resolve 方法是相同的。

ES6 的 promise API 没有提供很多方法,有一些有用的方法可以自己部署。 以下是如何部署两个不属于 ES6 的有用方法。

9.1. done()promise 对象的 ** 链,无论以 then 方法还是 catch 方法结尾,如果最后一个方法抛出错误,它可能不会被捕获(因为 promise 里面的错误不会冒泡到整个世界)。 因此,我们可以提供一个 done 方法,它始终位于链的末端,并保证抛出可能发生的任何错误。

asyncfunc() then(f1) .catch(r1) .then(f2) .done();
9.2. finally()finally 方法用于指定将要执行的操作,而不管 promise 对象的最终状态如何。 它与 done 方法最大的区别在于它接受一个普通的 ** 函数作为参数,无论如何都必须执行。

server.listen(0) .then(function ()finally(server.stop);
生成器函数用于管理进程,当遇到异步操作时,通常会返回一个 promise 对象。

function getfoo() var g = function* (catch (e) function run(generator) ,function (error) )go(it.next())run(g);
超详细的 Promise 理解与实现前端 Promise 常见应用场景正确理解 Promise 执行过程的态势 [J**Ascript]手写 Promise 必须能够深入揭开 Promise 微任务注册和执行流程的神秘面纱Promise 原理与实现超详细的 Promise 理解与实现前端 Promise 常见应用场景正确理解 Promise 执行过程的态势【J** ascript】一定能够要编写手写承诺,请添加:承诺allsettled()

直接参考文档:

相似文章

    你对蓝鲸了解多少?

    蓝鲸是地球上最大的现存动物,也是地球历史上已知最大的动物。它们属于须鲸科,目前已知有四个亚种,分布在世界海洋中。蓝鲸的身体细长而流线型,背部呈蓝灰色,下半身较轻。它们平均长 米,重近 吨,相当于 头大象的总和。有记录以来最大的蓝鲸是 这只雌性长米,重吨,于上世纪初在南乔治亚岛附近被捕获。蓝鲸是一种滤...

    您对割炬维修了解多少?

    您对割炬维修了解多少?火炬是石油 天然气等化工行业生产中不可缺少的重要设备,其维护保养对保证生产安全稳定具有重要意义。但是,由于割炬结构和工作原理的复杂性,割炬的维护也成为一项高度专业的技术工作。本文将介绍割炬维护的基本知识 常见故障和处理方法,以帮助读者更好地了解割炬维护的相关知识。一 割炬保养的...

    冯姓,你知道多少?

    冯姓是多民族 多起源的古姓,在宋版 百家姓 中按人口顺序排名第九,在中国姓氏中排名第二十七。冯氏起源于姓氏,春秋时期,郑国的医生建子 姓 被郑健供奉在冯氏,于是得名与封地,是冯姓第一人。冯姓姬,原名魏。据 元河姓编 和 广云 记载,周 温王纪昌十五子毕公高的后裔毕万之子,继晋温公国后,封魏无子之子,...

    你对牙膏了解多少?

    牙膏和口红不在清单之列。衣食住行一般是指衣 食 住 行等基本生活必需品,而牙膏 口红不属于任何衣 食 住 行,都属于生活必需品。牙膏是生活中常用的物品。以下关于牙膏的说法是正确的 这个问题考察了技术。A项 牙膏中的清洁剂是产生泡沫并促进牙齿表面清洁的清洁剂。B项 口腔内的细菌构成微观的生态平衡,如果...

    你对TCP粘性数据包了解多少

    关键字 粘性包装,粘性包装溶液。TCP报文卡包是指在数据传输过程中,发送方连续发送的几个小数据包被接收方组合成大数据块或多个小数据包粘在一起接收的现象。TCP 是一种面向流的传输协议,其中数据在传输过程中被拆分为 TCP 段,并在接收方重新组装。由于TCP的流式处理特性,发送方连续发送的多个小数据包...