promise做js堵塞.实现运行完一个请求再运行另一个.

promise

  • 先了解异步和同步的区别
  • Promise是什么
  • promise的写法
  • promise的all和race方法

同步和异步的区别


同步

所有的操作都做完,才返回给用户。这样用户在线等待的时间太长,给用户一种卡死了的感觉(就是系统迁移中,点击了迁移,界面就不动了,但是程序还在执行,卡死了的感觉)。这种情况下,用户不能关闭界面,如果关闭了,即迁移程序就中断了。

异步

将用户请求放入消息队列,并反馈给用户,系统迁移程序已经启动,你可以关闭浏览器了。然后程序再慢慢地去写入数据库去。这就是异步。但是用户没有卡死的感觉,会告诉你,你的请求系统已经响应了。你可以关闭界面了。不用等所有操作都做完,就相应用户请求。

区别

同步,是所有的操作都做完,才返回给用户结果。即写完数据库之后,再响应用户,用户体验不好。
异步,不用等所有操作都做完,就相应用户请求。即先响应用户请求,然后慢慢去写数据库,用户体验较好。

promise是什么

Promise是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6将其写进了语言标准,统一了用法,原生提供了Promise对象。

所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise是一个对象,从它可以获取异步操作的消息。Promise提供统一的API,各种异步操作都可以用同样的方法进行处理。

  • promise 特点

(1)对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已完成,又称Fulfilled)和Rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。

(2)一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从Pending变为Resolved和从Pending变为Rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。就算改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。

  • promise 缺点

  1. 首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。
  2. 其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。
  3. 第三,当处于Pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。

为了方便,定义一个promise对象

  const promise = new Promise(function (resolve, reject) {
    var timeOut = Math.random() * 2;//定义一个随机数乘二
    setTimeout(function () { //延迟执行
        if (timeOut < 1) {   //小于一执行成功回调
            resolve('200 OK');
        }
        else {     //大于一执行失败回调
            reject('timeout in ' + timeOut + ' seconds.');
        }
    }, timeOut * 1000);
})

promise 的写法

  • 写法一(用then成功和catch失败)

promise
.then(function (r) {
    log('ok: ' + r);
}).catch(function (reason) {
    log('Failed: ' + reason);
});

  • 写法二(用then(成功,失败),参数来进行回调)

promise
.then(
        function (r) { //参数一
            log('ok: ' + r);
        },
        function (reason) { //参数二
             log('Failed: ' + reason);
        });

promise的all和race方法

  • all的用法

all方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调。最后多个函数得到的resolve值都会放在同个then里面,all会把所有异步操作的结果放进一个数组中传给then,也就是下面的results数组

Promise
.all([runAsync1(), runAsync2(), runAsync3()])
.then(function(results){
    console.log(results);
});
  • race的用法

中文翻译是赛跑的意思,他的用法很all相同,都是意思恰好是相反的,all是等所有的回调方法都执行完毕,才then,只要所有方法之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数.

Promise
.race([runAsync1(), runAsync2(), runAsync3()])
.then(function(results){
    console.log(results); //如果runAsync1先运行完,then就自己输出runAsync1的resolve值,但是其他的方法还是会继续执行.
});

下面介绍实战篇

let por = new Promise((r, j) => {
             方法一
     })
     .then(() => {
                方法二
             }
         )

是不是简单且容易实现~~~~~~~~

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在清除缓存后,如果一个页面需要多次调用接口获取 token,你可以使用以下方法来处理: 1. 使用异步请求:确保每个接口的调用是异步的,这样可以避免一个接口的调用阻塞其他接口的执行。 2. Promise 链式调用:使用 Promise 来管理接口调用的顺序。在每个接口请求成后,再发起下一个接口的请求。这样可以确保前一个接口的响应返回后再调用下一个接口。 ```javascript // 使用 Promise 链式调用多个接口 function getToken1() { return new Promise((resolve, reject) => { // 发起 getToken1 接口请求 // 处理成功则调用 resolve(response),否则调用 reject(error) }); } function getToken2() { return new Promise((resolve, reject) => { // 发起 getToken2 接口请求 // 处理成功则调用 resolve(response),否则调用 reject(error) }); } function getToken3() { return new Promise((resolve, reject) => { // 发起 getToken3 接口请求 // 处理成功则调用 resolve(response),否则调用 reject(error) }); } // 调用示例 getToken1() .then((response1) => { // 处理 getToken1 的响应数据 return getToken2(); // 返回一个新的 Promise 对象 }) .then((response2) => { // 处理 getToken2 的响应数据 return getToken3(); // 返回一个新的 Promise 对象 }) .then((response3) => { // 处理 getToken3 的响应数据 // 所有接口请求成 }) .catch((error) => { // 处理错误情况 }); ``` 通过使用 Promise 链式调用,你可以确保每个接口的调用顺序和依赖关系,并在所有接口请求成后进行处理。 请根据实际情况替换示例中的接口请求代码,并根据需要进行错误处理和数据处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值