ES6-10:Promise

这篇具有很好参考价值的文章主要介绍了ES6-10:Promise。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前端开发因为网络交互的存在,产生了一种最常见的独特场景——异步,即程序执行的过程并非完全按照代码的书写顺序执行。异步编程的解决方法有①回调函数、②事件、③Promise、④观察者对象;
Promise是ES6提供的一种异步编程的一种解决方案。简单来书就是一个容器,里面存放着某个未来才会结束的事件;从语法角度来说是一个构造函数(对象),可以对各种异步操作进行同样的处理方法。

1.Promise特点

  • 3种状态:Pending(进行中)、Fulfilled(已成功)、Rejected(已失败);
  • 对象状态不受外界影响:只有异步操作的结果可以决定当前是哪一种状态,任何其他操作都无法改变这个状态;
  • 2种不可逆状态改变:只有两种状态改变①Pending->Fulffiled、②Pending->Rejected;只要两种情况发生任何一种,状态就凝固定型不再改变,即Resolved,任何时候都能且仅能得到这个结果;即使在添加新的对象也立即得到Resolved的结果;

2. 创建方法

  • 创建:let p=new Promise(function(resolved,reject){});
var promise=new Promise(function(resolve,rejecte){
//do somthing here
if(/*异步操作成功*/){resolve(value)
}else{reject(value)};
})

// 案例1 :Promise创建时立即执行
let promise1=new Promise(function(resolve,reject){
    console.log("Promise is creating...");
    resolve();
});
promise1.then(function(){console.log("Promise is resolved !")});
console.log("Hi Script is Running...");


// Promise is creating...
// Hi Script is Running...
// Promise is resolved !

// 案例2:Promise返回值可带参数
var p1=new Promise(function(resolve,reject){});
var p2=new Promise(function(resolve,reject){
    // do some other things...
    resolve(p1);
})

// 案例3 :Promise状态定型的会回调函数在本轮事件循环结束时执行
new Promise((resolve,reject)=>{
    console.log(1);
    resolve(2);
    console.log(3);
}).then(res=>{
    console.log(res);
})
// 1
// 3
// 2

// 案例4:显示return语句后的代码不执行
new Promise(function(resolve,reject){
    console.log(1);
    return resolve(2);
    console.log(3);
}).then(res=>{
    console.log(res)
});
console.log(4)
// 1
// 4
// 2

Promise构造函数接受一个函数作为参数,参数函数提供两个参数方法,分别是resolve和reject,这两个方法有JavaScript引擎提供,不用自己部署;Promise实例创建后会立即执行,然后会执行代码中所有的同步操作, 最后会在Promise状态定型后,执行then方法指定的回调函数 ;Promise的回调函数resolve和reject都可带有参数;Promise的回调函数在状态定性后的下一轮事件中执行,即无论状态在何处定型(resolve()),都不影响Promise中其他代码的执行,但显示return语句会影响;

3. 基本方法

  • Promise.prototype.then(resolveFn,rejectFn?):为Promise实例添加状态改变是的回调函数,返回至为Promise对象;该方法可链式重复调用,将前一个处理结果作为下一个函数的入参,如: promise.then().then()
  • Promise.prototype.catch():指定Promise发生错误时的回调函数,返回值为Promise对象,即Promise.then(null,rejection)的别名;Promise的错误对象具有“冒泡”性质,会一直向后传递,直到被catch或reject捕获;但如果Promise没有使用catch指定错误的处理方法,Promise的错误方法将永远不会传递到外层代码,即不会有任何反应;
// 案例5:Promise 错误对象冒泡--then过程中的错误会一直传递给最后至被捕获
let p1=new Promise((resolve,reject)=>{resolve(httpFn)});
let p2=new Promise((resolve,reject)=>{p1});
let p3=new Promise((resolve,reject)=>{});
p3.then(p2).then(otherFn).catch(err=>{errorFn});

// 案例6:Promise的状态一旦定性将无法被改变,即一个Promise实例有且仅有一次改变状态的机会
let p4=new Promise((resolve,reject)=>{
    resolve('ok');
    throw new Error('test');
});
p4.then(res=>{console.log(res)}).catch(err=>{console.log(err)});
// ok

// 案例7
let soneFn=function(){
    return new Promise(function(resolve,reject){
        resolve(x+2);//此处应该报错,因为x未声名 
    })
}
someFn.then(function(){console.log('Everythings is ok.')});
// Everything is ok.
/////因未使用catch捕获Promise异常,报错不会被捕获,也不会传递到外层代码;相反代码正常运行,但会打印错误ReferenceError: x is not defined.

  • Promise.all(arrLike):将一个具有Iterator接口的数据对象包装成一个新的Promise实例,返回值;

①参数arrLike可以是Promise数组、或具有遍历器的数据;如果参数不是Promise数组,则调用Promise.resolve()方法将参数转为Promise实例,在进一步处理;

②返回Promise实例的状态:被封装的Promise实例都为Fullfiled状态时,封装返回Promise状态才会变成Fullfied;否则只要有一个为rejected,则会将第一个rejected的实例返回给封装后的Promise,同时,封装后的Promise都会变成rejected;文章来源地址https://www.toymoban.com/news/detail-711187.html

let pro1=new Promise.all([p1,p2,p3]);
let pro2=new Promise.all([1,2,3]); 
  • Promise.race(arrLike):将多个具有Iterator接口的数据包装成一个Promise实例;与Promise.all()方法类似;不同之处在于,只要被包装的Promise实例只要有一个率先改变状态,变回将状态结果传递给封装后的Promise对象;
  • Promise.resolve(argu):将一个数据转换成Promise对象;根据传入参数类型的不同处理方法不同,如下:
    ① 参数不存在:直接返回一个状态为Resolved的Promise对象;
    ② Promise对象:返回Promise对象,不做任何处理;
    thenable对象:即一个具有then方法的对象;将这个对象转换成Promise对象并立即执行htneable的then方法;
    ④ 不具有thenable方法或非对象:返回一个新的Promise对象,状态为resolved,结果为参数本身;
  • Promise.reject(argu):返回一个Promise对象,其状态为Rejected;错误结果为整个参数本身;

5. 与steam事件、Observerble(观察者模式的区别)

  • Promise、Observe都是将异步操作转换成同步操作的实现方式;
  • Promise、Observe都可以进行聚合操作;
  • Promise的状态是不可逆 的,其状态仅有一次改变的机会,一旦改变,状态便定型;结果值需要手动调用才可传递给后续操作
  • Observe的状态是可以多次重复可变的,其状态会根据入参改变并传递给观察者;结果值会主动通知到所有订阅者(后续操作);

到了这里,关于ES6-10:Promise的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ES6知识】Promise 对象

    1.1 概述 Promise 对象用于表示一个异步操作的最终完成(或失败)及其结果值。是异步编程的一种解决方案(可以解决回调地狱问题)。 一个 Promise 对象代表一个在这个 promise 被创建出来时不一定已知值的代理。它让你能够把异步操作最终的成功返回值或者失败原因和相应的

    2024年02月07日
    浏览(42)
  • 【ES6】Promise.all用法

    Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。 上面代码中,Promise.all()方法接受一个数组作为参数,p1、p2、p3都是 Promise 实例,如果不是,就会先调用下面讲到的Promise.resolve方法,将参数转为 Promise 实例,再进一步处理。另外,Promise.all()方法的参数可以

    2024年02月09日
    浏览(35)
  • 第一章前端开发ES6基础

    认识ES6 概述 ES6表示ECMAScript规范的第六版,正式名称为 ECMAScript 2015 ,ECMAScript是由ECMA国际标准组织制定的一项 脚本语言 的标准规范化,引入了许多新特性和语法。 其中包括 箭头函数、let和const声明、类、模板字符串、解构赋值、参数默认值、展开操作符、Promise 等等。这些

    2024年02月08日
    浏览(51)
  • 第二章前端开发ES6基础

    目录 扩展运算符 概述 语法 应用 模板字符串 概述 应用 内置对象扩展 概述 数组扩展方法 字符串扩展方法 set数据结构 概述 基本使用 操作方法 遍历方法 认识symbol 概述 作用 基本使用 项目 扩展运算符 概述 扩展运算符(spread operator)是 ES6 中新增的一种运算符,用 三个点(

    2024年02月07日
    浏览(49)
  • 【ES6】Promise.race的用法

    Promise.race()方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。 上面代码中,只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。 Promise.race()方法的参数与Promise.all()方法一样,如果不是 Pr

    2024年02月10日
    浏览(36)
  • 【ES6】fetch函数和Promise

    fetch函数是现代JavaScript中用于发起HTTP请求的一个非常强大的工具。它返回一个Promise,这个Promise在请求成功时解析为Response对象,或者在请求失败时拒绝。 以下是一个基本的fetch使用示例: 在这个例子中,我们首先向https://api.example.com/data发起一个GET请求。然后,我们检查响应

    2024年02月09日
    浏览(38)
  • 【ES6】Promise.allSettled的用法

    Promise.allSettled() 是一个Promise方法,用于处理一个Promise数组,返回一个新的Promise数组,每个元素对应原始Promise的状态。这个方法可以用于处理多个异步操作,并且能够获取每个操作的结果和状态。 下面是Promise.allSettled()的详细代码示例: 输出结果: 在上面的代码中,我们创

    2024年02月10日
    浏览(38)
  • ES6基础知识六:你是怎么理解ES6中 Promise的?使用场景?

    一、介绍 Promise,译为承诺,是异步编程的一种解决方案,比传统的解决方案(回调函数)更加合理和更加强大 在以往我们如果处理多层异步操作,我们往往会像下面那样编写我们的代码 阅读上面代码,是不是很难受,上述形成了经典的回调地狱 现在通过Promise的改写上面的

    2024年02月15日
    浏览(49)
  • ES6 Promise/Async/Await使用

    Promise应用 在工作中, 我们经常会遇到用异步请求数据, 查询一个结果, 然后把返回的参数放入到下一个执行的异步函数像这样: 当我们使用Promise后, 我们的程序就变成了这样: 控制台输出如下: async/await应用 看是不是简洁很多了, 如果你不想使用这种链式调用, 也可以结合async/

    2024年02月12日
    浏览(44)
  • 你是怎么理解ES6中 Promise的?使用场景?

    Promise ,译为承诺,是异步编程的一种解决方案,比传统的解决方案(回调函数)更加合理和更加强大 在以往我们如果处理多层异步操作,我们往往会像下面那样编写我们的代码 阅读上面代码,是不是很难受,上述形成了经典的回调地狱 现在通过 Promise 的改写上面的代码 瞬

    2024年03月15日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包