从异步概念到callback回调函数到promise

您所在的位置:网站首页 promise怎么封装 从异步概念到callback回调函数到promise

从异步概念到callback回调函数到promise

2024-01-17 12:47| 来源: 网络整理| 查看: 265

异步概念

javascript语言的执行环境的'单线程'的.

所谓'单线程',就是指一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推。

(实际上我认为计算机从微观上讲都是单线程的,因为一台机器在同一时间只能做一件事情。然而从宏观上讲,在我们人的对时间的感知范围内,认为机器可以在一个时间做多个事情。这就是我们感知的异步/多线程/并发。本质上机器运算也是按照先后顺序来的,这也就为什么会有微积分等这样的学科来研究事物的本质了。)

概念这东西是人对事物认知的抽象描述,便于人们知识传递。而要理解好概念则要对引出这个概念的事物本质有所了解。

同步任务:在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;

异步任务:不进入主线程,而进入任务队列中的任务,只有任务队列通知主线程,某个异步任务可以执行了,这个任务才会进入主线程执行。

事件循环(Event Loop):只有执行栈中的所有同步任务都执行完毕,系统才会读取任务队列,看看里面的异步任务哪些可以执行,然后那些对应的异步任务,结束等待状态,进入执行栈,开始执行。

最简单的异步-callback // 例1 function foo(callback){//定义函数的时候将另一个函数(回调函数)作为参数传入定义的函数中。 $ajax({ //... success:callback//异步操作执行完毕后,再执行该回调函数,确保回调在异步操作之后执行。 }) } function myCallback(result){ //... } foo(myCallback) // 回调函数本身是我们约定俗成的一种叫法,我们定义它,但是并不会自己去执行它,它最终被其他人执行了。 // 例2 function f1(callback){ setTimeout(function () { // f1的任务代码 callback() }, 1000) } f1(f2)

优点:比较容易理解; 缺点:1.高耦合,维护困难,回调地狱;2.每个任务只能指定一个回调函数;3.如果几个异步操作之间并没有顺序之分,同样也要等待上一个操作执行结束再进行下一个操作。

promise

Promise是抽象异步处理对象以及对其进行各种操作的组件。

Promise并不是从JavaScript中发祥的概念。Promise最初被提出是在 E语言中, 它是基于并列/并行处理设计的一种编程语言

JavaScript的异步处理,最简单的是利用回调函数,而Promise则是把类似的异步处理对象和处理规则进行规范化, 并按照采用统一的接口来编写。

创建promise 1. new Promise(fn) 返回一个promise对象 2. 在fn 中指定异步等处理 2.1. 处理结果正常的话,调用resolve(处理结果值) 2.2. 处理结果错误的话,调用reject(Error对象) const promise = new Promise(function(resolve, reject) { // 不要问为什么写resolve和reject,这是promise封装的规定,比如你封装一个函数也得按照你的规定传参 // ... some code if (/* 异步操作成功 */){ resolve(value); } else { reject(error); } });

Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。

resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去。

reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。

promise.then(function(value) { // success }, function(error) { // failure });

then方法可以接受两个回调函数作为参数。第一个回调函数是Promise对象的状态变为resolved时调用,第二个回调函数是Promise对象的状态变为rejected时调用。其中,第二个函数是可选的,不一定要提供。这两个函数都接受Promise对象传出的值作为参数。

promise刚开始用的时候要理解这些概念,而我们又不知道它内部的封装实现,所以都会有十万个为什么,然而封装的好处就是我们可以不用理解内部实现,只要按照规定规则规范去使用它就能得到想要的结果。promise就是封装好的异步操作对象,我们可以使用它实现各种异步功能。

想要查看更多的promise使用请看 es6.ruanyifeng.com/#docs/promi…

想要了解更多的promise知识请看 liubin.org/promises-bo…

更深入的梳理异步编程的相关概念请看 juejin.cn/post/698016…



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3