promise

前言

在es6中Promise被列为正式规范。作为ES6中最重要的特性之一,我们有必要掌握并理解透彻promsie。

异步

在讲promise前我们先要知道什么是异步

在我们学习的传统单线程编程中,程序的运行是同步的(同步不意味着所有步骤同时运行,而是指步骤在一个控制流序列中按顺序执行)。而异步的概念则是不保证同步的概念,也就是说,一个异步过程的执行将不再与原有的序列有顺序关系。

简单来理解就是:同步 按你的代码顺序执行,异步不按照代码顺序执行,异步的执行效率更高。

我们看一下下面的代码

js 复制代码
function foo(){
    setTimeout(()=>{
        console.log('ling');
    },1000)
}

function bar(){
    console.log('long');
}
foo();
bar();

执行结果:

先出现的long过了一秒出现ling,为什么会这样呢?如果先等一秒出现long再出现ling就是同步,如图就是异步,但是世界上的任何一种语言不会是同步,设计成异步能提高运行效率。当js引擎遇到需要耗时的任务时会先跳过,执行完不耗时的代码再来执行耗时的。

在以前没有promise时候的程序员是怎么解决这个问题的呢

js 复制代码
let data=null;

function a(){
    setTimeout(()=>{
       data={name:'dai'} 
    },1000)
}


function b(){
    console.log(data.name+'好帅')
}

a();
b();

根据前文可知这种情况会报错,b会先执行,但a不先执行,data就没有name,这里一定要先执行a再执行b,那怎么办呢?

js 复制代码
let data=null;



function a(){
    setTimeout(()=>{
       data={name:'dai'} 
       b();//不跑完a,b也跑不了
    },1000)
}


function b(){
    console.log(data.name+'好帅')
}

a();

我们只需要将b放在方法a中执行就行了。但这样会出现一个新的问题,在一些大型项目中,其中的代码都是几千上万行,当出现a没结果b就无法执行,b没结果c无法执行(回调地狱)...........这个时候程序员的心态是爆炸的,当出现一个错误时,可能就会看到满屏的红色。为了解决这个问题我们的超人promise应运而生。

promise的介绍和用法

Promise是一个构造函数,生成promise实例,promise有三种状态

Resloved:表示操作成功

Rejected:表示操作失败

Pending:表示既没有成功也没有失败,等待中

具体用法如下代码

js 复制代码
function xq() {
    return new Promise((resolve,reject)=>{
    setTimeout(()=>{
         console.log('徐总相亲');
         resolve();//成功    reject();//失败
    },2000)
  })
}

function marry(){
    return new Promise((resolve,reject)=>{
    setTimeout(()=>{
        console.log('结婚');
        resolve();//成功    reject();//失败
    },1000)
 })
}


 function baby(){
    console.log('小徐出生');
 }


 xq().then(()=>{
    marry().then(()=>{
        baby();aomiao
    });
 });

这里我们写了三个方法,xq和marry都要耗时,如果没有promise顺序就会相反。在xq和marry中,都需要return promise对象,可能是resolve成功,也可能是reject失败。如果成功了才会执行.then里的回调函数,失败了会执行.catch里的函数,所以这里的结果就会是先等两秒出现"徐总相亲",等一秒出现"结婚"和"小徐出生"。

其中resolve和reject里面是可以写参数的

js 复制代码
function xq() {
    return new Promise((resolve,reject)=>{
    setTimeout(()=>{
         console.log('徐总相亲');
         resolve('相亲成功');//成功    reject();//失败
    },2000)
  })
}

function marry(){
    return new Promise((resolve,reject)=>{
    setTimeout(()=>{
        console.log('结婚');
        resolve('新婚快乐');//成功    reject();//失败
    },1000)
 })
}


 function baby(){
    console.log('小徐出生');
 }
 
 
 xq()
 .then((res)=>{
    console.log(res);
    return marry()
    .then((res2)=>{
        console.log(res2);
        baby();
    });

 });

结果就会是

总结

promise就是为了解决异步问题被创造出来的方法,可以控制代码的执行顺序。

感谢你的观看, 希望对你有用。

相关推荐
特立独行的猫A12 小时前
仓颉版 Tauri:基于轻量化线程与纯血鸿蒙架构的下一代 Web 混合开发利器
javascript
李游Leo13 小时前
HarmonyOS 7 ArkTS + ohpm:三方 JS 库副作用隔离与 API 26 升级回归【鸿蒙心迹】
javascript·回归·harmonyos
你挚爱的强哥13 小时前
【sgKeyboard】自定义组件:虚拟键盘
前端·javascript·计算机外设
锅里游的鱼吖13 小时前
echarts自定义折线图
前端·javascript·数据库
何何____14 小时前
Vue 全局事件总线详解
前端·javascript·vue.js
u01110267515 小时前
工具页案例图如何编写 alt让图片说明与处理场景对应
java·前端·javascript·图像处理·人工智能·算法·ai作画
事圆则缓15 小时前
Flutter 状态管理框架对比(五):GetX 的响应式、依赖注册与生命周期
前端·javascript·flutter
凌云志.16 小时前
【protobuf】proto3语法详解&通讯录2.x实现
java·前端·javascript
ss27316 小时前
AI全栈实战 | 2.1-03 JavaScript 核心:单线程+事件循环为什么不等同于多线程,原型链 vs Java 继承
java·开发语言·javascript
5008416 小时前
React Native for OpenHarmony 实战:三方库 react-native-crypto-js 的鸿蒙化适配指南
javascript·react native·性能优化·electron·harmonyos