promise的用法_Promise破除回调地狱!

c1316bb8cccb7abd10eaf5554c923592.png

先来个需求,依次读取三个文件,1.txt,2.txt,3.txt
const fs = require('fs');const path = require('path');fs.readFile(path.join(__dirname,'./1.txt'),'utf-8',(err,dataStr)=>{    if (err) return err;    console.log(dataStr);    fs.readFile(path.join(__dirname,'./2.txt'),'utf-8',(err,dataStr)=>{        if (err) return err;        console.log(dataStr);        fs.readFile(path.join(__dirname,'./3.txt'),'utf-8',(err,dataStr)=>{            if (err) return err;            console.log(dataStr);        })    })}
读取文件是异步操作,所以依次读取文件会嵌套式的时候写代码,所以形成了回调地狱。

c3454d6084b683fcba68ced2c212524a.png

如果依次取100个文件的内容,妈哎,是不是这个红色的箭头得拉很长,这样出错的概率是不是大幅增加。那么,此时,就展示了Promise的作用了。

那么Promise是什么,它主要将异步操作队列化,按照期望的顺序执行。

下面讲讲Promise的使用:

new Promise(  function (resolve, reject) {    // 一段耗时的异步操作    resolve('成功') // 数据处理完成    // reject('失败') // 数据处理出错  }).then(  (res) => {console.log(res)},  // 成功  (err) => {console.log(err)} // 失败)
  • resolve作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
    reject作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

  • promise有三个状态:
    1、pending[待定]初始状态
    2、fulfilled[实现]操作成功
    3、rejected[被否决]操作失败
    当promise状态发生改变,就会触发then()里的响应函数处理后续步骤;
    promise状态一经改变,不会再变。

  • Promise对象的状态改变,只有两种可能:
    从pending变为fulfilled
    从pending变为rejected。
    这两种情况只要发生,状态就凝固了,不会再变了。

上述中只要你new了Promise对象,如果在里面传入了方法,就会立即执行这个方法。 resolve和 reject两个方法形参一开就会被.then里面就会指定成功和失败的回调。但是一般用Promise的时候,会用一个方法将Promise包起来调用(怎么理解呢,就是你 需要读取文件的时候,记住是需要,而不是一引入脚本的时候就开始读取文件)。下面说说捕获机制,万一在第一步读取的文件不存在,这样就会报错,那么要自己输出报错信息的话,需要用到 catch。可以直接抛出错误变为rejected状态,所以绕过两个then直接跑到最下面的catch。当然你要某个报错之后,还能执行下去的话,建议每个都传个 reject。
Promise.all() 呢是批量执行,看下面的:
Promise.all([p1, p2, p3])用于将多个promise实例,包装成一个新的Promise实例,返回的实例就是普通的promise,它接收一个数组作为参数
数组里可以是Promise对象,也可以是别的值,只有Promise会等待状态改变
当所有的子Promise都完成,该Promise完成,返回值是全部值的数组。有任何一个失败,该Promise失败,返回值是第一个失败的子Promise结果。来个难度系数高点的 4512e21184beae3e23ef744bcaa0e2a0.png

c7edaafd64fd96a6b70f710614eea9b7.png

其实这个例子真的很生动,但是需要用心品,加油,你可以的fbcb667d09fa654426a182dd46a60c53.png

Promise.race() 类似于Promise.all() ,区别在于它有任意一个完成就算完成。
常见用法:
异步操作和定时器放在一起,如果定时器先触发,就认为超时,告知用户;
例如我们要从远程的服务加载资源,如果5000ms还没有加载过来我们就告知用户加载失败。

是不是觉得这些技能用的很方便cce05022dfbbb90a32b55c43f81f3ec7.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值