========================
New Note 16
异步操作(指令)是一种特殊的计算操作
#异步操作、异步编程与promise对象#一条语句,一个函数调用,一个对象方法的访问,都是「计算操作」,默认是同步的(下一操作等待上一操作的返回)。异步操作的是语句、函数和方法等不同层级的「操作」执行是不能等待的。
不同抽象级的异步操作/指令
这里强调,同默认的同步相对,【异步操作】的种类——异步语句、异步函数、异步对象(的方法),编程特性是要其安排处理程序。
异步操作背后的事件原理
想一想,异步操作结果不返回,当前任务就被挂起,那,JS程序接下来干嘛?从此可知,虽然JS是单进程,但JS应用是多任务并行的。这些并行任务通过【事件】的触发和排队让JS忙起来。异步任务,在返回结果并执行事件处理程序后,走到了“终点”。
系统任何【事件】都可以被认为是一种异步任务,包括真异步操作事件(用户交互输入,服务器请求,文件IO,定时操作等)和伪异步(对象生命事件)事件等。
异步任务的两段性质
#promise异步原理# 异步计算任务可分为两个部分(由JS线程排队处理,同步任务只有一个),第一部分是异步操作的发起,例如setTimeout函数的调用;第二部分是异步结果的处理,例如setTimeout的回调函数的调用。Promise对象是包括两个部分的计算,只是在对象构造时实现第一个任务,在then方法(中的子对象)实现第二部分——异步处理。
异步任务的第一段
异步操作(的任务)可简单,也可以是比较复杂,发起操作时(第一个任务)需要准备条件,例如发起ajax需要创建XHR对象,和请求数据等;除了这个异步输入数据,异步也可返回处理的结果(成功或错误),这都是在then之间,第一步的任务。
异步任务两段执行的系统支持
对于JS原生的异步操作API(例如 setTimeout ),我们只需基础逻辑理解即可用,无需多理角背后的原理。然,背后的原理也不会太复杂。任务异步任务都分两段任务(job),前一段触发,后一段响应异步回调。关键是后一段的如何实现。实现主要靠登记callback函数,辨识异步事件,这些都是靠系统运行时提供。
#promise异步原理# 学习promise异步编程技术,最有趣的问题是,promise对象是怎样的对象,我如何去制作它?对象技术是JS提供给我们基本程序构件(计算任务的模板),而promise对象则在基本的计算模板之上,加入了异步性质——把两个相关的,但不同时刻执行的「子任务」安排在一起(用一个对象表征)。理解这些原理,我们就能在写promise对象构造器和then方法时,认清它的意义。
与默认的同步不同,异步的实现原理需要运行时/环境的额外支持,例如事件循环。
界面交互事件(异步)表面上跟promise对象的异步任务有区别,但实质还是一样的,都是在基于event loop基础技术的应用。只是,「异步活动」的“安装”或初始化(处理函数是谁触发,系统需要记录)的时机不同。promise异步活动是动态安装的,而界面交互事件,是在页面加载时安装的(点击一个按键是可多次触发)。
promise技术是OO式异步编程
#promise异步原理# promise对象技术,就是面向对式的异步编程,对原来面向过程的callback异步编程模式。OO异步,使用了对象级的概念来实现异步活动。
promise技术为简化「异步计算流程」而设计
又回到技术/工具,与任务的角度。promise作一种技术,它的名字是奇怪的,承诺是一种工具?有怎么样的工具特性功能?承诺工具完成的任务,又是一种怎样的任务?
大类异步任务其实是比较少的,JS程序周边的交互对象不多:用户、服务器和系统,三个而已,所异步操作API种类是屈指可数。异步任务复杂在于具体的异步任务,例如交互的数据复杂性,和交互的次数(业务逻辑复杂性)。
promise作为工具,解决的就是「交互的数据复杂性」,提供清晰控制流(多次异步操作)和错误处理,简化应用程序的复杂业务逻辑。
“袭击”复杂异步任务控制流的复杂性。使用promise,复杂异步流会变得易懂,前提是你掌握了习惯了promise
OO式 promise 如何做到简化
promise对象在使用上的设计,只是为了做到代码层上“看着像”同步,实际执行还是异步。then方法在promise对象完成构成(从pending状态到fulfilled或rejected状态)不会被执行。
因为promise实现异步(看着像)代码是同步式,所以比较阅读理解(主要针对多个相关异步任务的串连——前一个异步结果用作下一个异步任务的输入)