返回顶部
首页 > 资讯 > 精选 >Promise异步操作是什么
  • 777
分享到

Promise异步操作是什么

2023-06-03 16:06:34 777人浏览 安东尼
摘要

这篇文章主要讲解了“Promise异步操作是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Promise异步操作是什么”吧!什么是异步操作?所谓异步操作,指的是可以跟当前程序同时执行的操

这篇文章主要讲解了“Promise异步操作是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Promise异步操作是什么”吧!

什么是异步操作?

所谓异步操作,指的是可以跟当前程序同时执行的操作。举例:

$("#page").scrolltop(0 ,1000);    //使用1秒钟时间将页面滚动至顶部
$("#nav-float").hide (1000);    //使用1秒钟时间将悬浮导航栏隐藏

只要你稍微有点异步编程经验,就应该知道,这两个方法会同时完成。

它们的编写顺序并不会影响它们的执行顺序

//异步操作的特点就是,不会打断当前程序的执行
//getUsers请求发出后,会立刻向下继续执行第二个请求
ajax("/getUsers",function(data) {
    //回掉函数会在请求成功后调用
})
//resumelist请求会立刻开始,无论getUsers是否结束
ajax("/resumelist", function(data) {
 
})
//至于哪一个ajax先返回结果并执行回调函数,从代码的编写顺序上是无法确定的。

我们可以给异步操作做一个简单的定义

当一个操作开始执行后,主程序无需等待它的完成,可以继续向下执行。此时该操作可以跟主程序同时(并发)执行。这种操作我们就称之为异步操作。 通常当操作完成时,会执行一个我们事先设定好的回调函数来做后续的处理。

我们常见的异步操作例如:

· 添加定时器 setTimeout/setInterval

· 执行某个动画 animate

· 发起网络请求 request

异步会带来什么问题?

比如我们现在有两个动画,需要按顺序来执行,也就是第一个结束,第二个才能开始

这个时候可能有点麻烦,传统的解决方法是通过回调:

animateA(function( ){
      animateB( ); 
})     

这种方案显然不太好,如果有很多异步操作需要顺序执行,就会产生所谓的“回调地狱”

ajaxA(function( ){
    ajaxB(function( ){
        ajaxC(function( ){
            ajaxD(function( ){
                ......  
            });
        });
    });
})

这种代码不管是写起来还是读起来都比较烦人。

我们来看下经过Promise改造后的样子(伪代码)

new Promise(ajaxA)
        .then(ajaxB)
        .then(ajaxC)
        .then(ajaxD); 

Promise的使用及原理

要熟练Promise的的使用,你必须要先搞懂它解决问题的原理

贴一段实际的Promise代码,你来感受一下先:

newPromise(resolve=>{
    ajax("/pay/post", data=>resolve() );
}).then(resolve=>{
    ajax("/order/fix", data=>{
        //处理数据  
    })
})

上面的代码使用了es6的箭头函数,虽然大大简化了代码的写法,

但对于初级程序猿来讲极不友好

读这种代码简直跟读金刚经差不多。

我们把代码还原成ES5的样子

new Promise(function(resolve){
    ajax("/pay/post",function(data){
        resolve();
    })
}).then(function(){
    ajax("/order/fix",function(data){
 
    })
})

Promise异步操作是什么

接下来,我们就按照费曼技巧来一步步的学习Promise是如何解决问题的

问题1, 作为一个异步函数,尤其像ajax这种网络请求,连我自己都不能确定函数的执行时间,Promise是怎么知道第一个函数什么时候结束的? 然后再开始执行下一个?

Promise并没有那么神奇,它并不能知道我们的函数什么时候结束,
你注意到上面代码中的第3行了吗
在ajax请求结束执行回调的时候,
我们调用了一个resolve()函数,这句代码非常的关键.
这其实就是在通知Promise,当前这个函数结束啦,
你可以开始执行下一个。 这时Promise就会去执行then里面的函数了。

问题2, 所以按照你的意思,如果我不调用这个方法,Promise就不知道这个函数有没有结束,那么then里面的函数就不会执行,也就是说我的第二个请求就永远不会发送了呗?

BinGo!! 恭喜你已经学会了逻辑推理+抢答。

问题3, 可是这个resolve函数是从哪来的? 需要我自己定义吗? 从代码上看它好像是个参数,那又是谁传入函数中的?

你得先弄明白Promise的基本结构
new Promise(函数1).then(函数2);
 
我们把函数1和函数2都以参数形式传给了一个Promise对象,
所以接下来函数1和2都会由这个Promise对象控制,
简单的说,函数1和函数2都会由Promise对象来执行。
所以在函数1执行时,参数也当然是由Promise对象传递进去的。
 
new Promise(function(resolve){
  //resolve是Promise对象在调用函数时传入的参数
}).then(函数2);

问题4, Promise对象为啥要在执行第1个任务的时候,把这个resolve函数 传进来,有什么目的?

你说呢?

废屁,知道还用问你?

真是猪脑子,刚才不是已经说了吗? 
Promise对象没办法知道我们的异步函数啥时候结束。
那我来问你, 如果你去车站接人,
可是你又不知道对方何时下车,你会咋办?

把我电话号码给他,快到了打我电话呗

没错,Promise解决问题也采用了同样的思路。
它传进来的resolve函数, 就好像一个对讲机,
当我们的异步任务要结束时,通过对讲机 来通知Promise对象。
也就是调用resolve方法
 
new Promise(function(resolve){
    ajax("/pay/post",function(data){
        //当请求结束时,通过调用resolve方法,通知Promise对象,该任务已完成
        resolve(); //收到通知后,Promise会立刻开始函数2的执行
    })
}).then(函数2);

懂了,所以这个resolve函数,必须在异步任务的最后调用(例如ajax的回调方法),相当于告诉Promise对象,该任务结束,请开始下一个。

完全正确

问题5, 所以Promise也不过如此嘛,它没有带来什么功能上的革命性变化, 因为使用传统的回调嵌套的方式,同样可以完成效果。 说白了它就是编码方式上的改进??

基本是这样的,但Promise带来的编码方式以及异步编程思路上的进步是非常巨大的。

问题6, 那如果我有ajaxA、ajaxB、ajaxC三个异步任务,想按照先A后B再C的顺序执行,像这样写行吗?

new Promise(function(resolve){
    ajax("/AAA", function(){
        resolve(); //通知Promise该任务结束
    })   
}).then(function(resolve){
    ajax("/BBB", function(){
        resolve();//通知Promise该任务结束
    })
}).then(function(){
    ajax("/CCC", function(){ //.... })
}) 
上面的这种写法是不对的。 
Promise的中文含义是“承诺”,
则意味着,每一个PORMise对象,代表一次承诺
而每一次承诺,只能保证一个任务的顺序,也就是说
new Promise(A).then(B); 这句话表示, 只能保证A和B的顺序
 
一旦A执行完,B开始后,这次承诺也就兑现了,Promise对象也就失效了
那如果还有C呢? 我们就必须在函数B中,
重新创建新的Promise对象,来完成下一个承诺,具体的写法就像这样:
 
new Promise(函数1(resolve){
    ajaxA("xxxx", function(){
        resolve();//通知Promise该任务结束
    })   
}).then(函数2(){
    //在函数2开始运行后,第一次创建的Promise对象完成使命,已经不能再继续工作。
    //此时,我们创建并返回了新的Promise对象
    return new Promise(function(resolve){
        ajaxB("xxxx", function(){
            resolve();//通知新的Promise对象该任务结束
        })   
    })
}).then(函数3(){ //尽管这里使用了链式调用,但负责执行函数3的,已经是新的Promise对象了
    // 如果,我们还有ajaxD需要顺序调用
    // 那就必须在这里重新new Promise()对象了
    ajaxC("xxx", function(){     })
})  

问题7, 懂了,那Promise还有什么其它强大的功能吗?

有啊,例如: 如果我有 A,B,C 三个异步任务,ABC同时开始执行
当A,B,C三个任务全部都结束时,执任务D,
传统方法实现起来就比较复杂,Promise就非常简单,就像这样:
 
Promise.all([new Promise(A), new Promise(B), new Promise(C)])
.then(function(){
    D();
});

问题8, 那如果我希望A,B,C 其中任意一个任务完成,

就马上开始任务D,该怎么做?

Promise.race([new Promise(A), new Promise(B), new Promise(C)])
.then(function(){
   D();
});

感谢各位的阅读,以上就是“Promise异步操作是什么”的内容了,经过本文的学习后,相信大家对Promise异步操作是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Promise异步操作是什么

本文链接: https://lsjlt.com/news/234941.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Promise异步操作是什么
    这篇文章主要讲解了“Promise异步操作是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Promise异步操作是什么”吧!什么是异步操作?所谓异步操作,指的是可以跟当前程序同时执行的操...
    99+
    2023-06-03
  • async/await与promise(nodejs中的异步操作问题)
    举例写文章详情页面的时候的一个场景:首先更改文章详情中的 PV,然后读取文章详情,然后根据文章详情中文章 Id 查阅该文章评论和该文章作者信息。获取全部数据之后渲染文章详情页。数据库操作都是异步的,最直接想...
    99+
    2022-06-04
    操作 await async
  • Nodejs异步编程中的Promise有什么作用
    这篇文章主要介绍“Nodejs异步编程中的Promise有什么作用”,在日常操作中,相信很多人在Nodejs异步编程中的Promise有什么作用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,...
    99+
    2024-04-02
  • javascript的异步操作方法是什么
    这篇“javascript的异步操作方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇...
    99+
    2024-04-02
  • 微信小程序中如何使用Promise进行异步操作
    这篇文章主要介绍微信小程序中如何使用Promise进行异步操作,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!微信小程序中使用Promise进行异步流程处理我们知道,JavaScrip...
    99+
    2024-04-02
  • Promise、Generator和Async的差异是什么
    本篇内容主要讲解“Promise、Generator和Async的差异是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Promise、Generator和A...
    99+
    2024-04-02
  • aiomysql异步操作mysql
    aiomysql是一个从asyncio(PEP-3156/tulip)框架访问MySQL数据库的库。它依赖并重用PyMySQL的大部分部分。aiomysql试图成为一个很棒的aiopg库,并保留相同的api、外观和感觉。在内部aimysql...
    99+
    2023-01-31
    操作 aiomysql mysql
  • PHP怎么实现异步操作
    这篇文章主要讲解了“PHP怎么实现异步操作”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP怎么实现异步操作”吧!1.为啥PHP需要异步操作?一般来说PHP适用的场合是web页面展示等耗时...
    99+
    2023-06-04
  • Promise的概念和作用是什么
    这篇文章主要讲解了“Promise的概念和作用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Promise的概念和作用是什么”吧! 从异步编...
    99+
    2024-04-02
  • aioysql(异步操作MySQL)-p
    python异步IO初探 探索异步IO执之前,先说说IO的种类 阻塞IO最简单,即读写数据时,需要等待操作完成,才能继续执行。进阶的做法就是用多线程来处理需要IO的部分,缺点是开销会有些大。 非阻塞IO,即读写数据时,如果暂时不可读...
    99+
    2023-01-31
    操作 aioysql MySQL
  • ADO.NET对象操作步骤是什么
    这篇文章主要介绍“ADO.NET对象操作步骤是什么”,在日常操作中,相信很多人在ADO.NET对象操作步骤是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ADO.NET对象操作步骤是什么”的疑惑有所帮助!...
    99+
    2023-06-17
  • PHP接口重定向操作:同步还是异步?
    在开发Web应用程序时,接口重定向是一项非常常见的任务。接口重定向是指将请求从一个URL重定向到另一个URL。然而,在进行接口重定向时,我们需要考虑同步还是异步操作。在本文中,我们将探讨PHP接口重定向操作的同步和异步操作以及如何在Web...
    99+
    2023-07-03
    接口 重定向 同步
  • JS异步堆栈追踪之为什么await胜过Promise
    概述 async/await和Promise的根本区别在于await fn()暂停当前函数的执行,而promise.then(fn)在将fn调用添加到回调链后,继续执行当前函数。 ...
    99+
    2024-04-02
  • javascript Promise是什么
    这篇文章主要介绍“javascript Promise是什么”,在日常操作中,相信很多人在javascript Promise是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2024-04-02
  • 什么是异步redis
    异步redis是指访问数据的机制,异步则指主动请求数据后便可以继续处理其它任务,随后等待IO操作完毕的通知,得到通知之后,再去选择对这些数据做操作。...
    99+
    2024-04-02
  • 什么是js异步
    这篇文章主要讲解了“什么是js异步”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“什么是js异步”吧!如果调用者在函数返回时无法获得预期的结果,但在未来需要通过一定的手段获得,那么函数是异步的...
    99+
    2023-06-25
  • golang异步是什么
    在golang中,异步是指不按照代码顺序执行,一个异步过程的执行将不再与原有的序列有顺序关系;在异步中,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。golang异步主要是由协程(goroutine)实现的;g...
    99+
    2023-05-14
    异步 go语言 Golang
  • C++中怎么实现异步操作
    C++中怎么实现异步操作,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。实现(代码)#include <iostream> #include&nb...
    99+
    2023-06-17
  • C#中怎么实现异步操作
    C#中怎么实现异步操作,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。//首先准备好,要进行异步的方法(能异步的,***不多线程)  private ...
    99+
    2023-06-17
  • ADO.NET中怎么实现异步操作
    ADO.NET中怎么实现异步操作,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。线程是允许程序的一部分独立于其他部分运行。线程可以在单个线程执行的同时运行多个操作,让用户感到像同...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作