promise
在理解promise的使用之前,首先要理解js语言的运行环境是单线程的,也就是说一次只能完成一个任务,也就是一条流水线,如果有多个任务就必须排队,前面一个任务完成,再执行后面一个任务,以此类推。这与java的多线程环境截然不同,所以要加以区分。
1、对于js同步和异步,在这里需要加以备注一下:
我们可以简单的理解为:可以改变程序执行顺序的操作就可以看成为异步操作。其实异步和同步的差别很简单,就在于这条流水线上各个流程的执行顺序不同。最基础的异步是settimeout和setInterval函数如图示例所示:
而执行顺序为
也就是说,“王一”和“刘五”所在的流水线为同步,即在主线程上执行的任务,,而setTimeout函数为异步任务,不进入主线程,而进入“任务队列”。程序先执行同步里的内容,执行完毕,“任务队列”开始通知主线程,请求执行任务,该任务才会进入主线程来执行。
而“任务队列”是一个事件的队列,IO设备完成一项任务,就在“任务队列”中添加一个事件,表示相关的异步任务可以进入主线程了,主线程读取‘任务队列’,就是读取里面就哪些事件。‘任务队列’中的事件除了IO设备的事件以外,还包括用户产生的一些事件(比如鼠标点击、页面滚动等)。
异步任务必须指定回调函数,当主线程开始执行异步任务,就是执行相应的回调函数。例如ajax的success,complete,ERROR也都指定了各自的回调函数,这些函数就会加入任务队列中,等待执行。
2、promise
利用promise可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,promise对象提供统一的接口,使得控制异步操作更加容易。
但注意promise无法取消,一旦建立就会立即执行,无法中途取消。而且,如果不设置回调函数,promise内部抛出的错误不会反映到外部。当处于Pending状态时,无法得知进展到哪一个阶段。
1)promise有三个状态:
Pending-promise的初始状态,等到任务完成或是被拒绝;resolved-执行完成并且成功的状态;Rejected-执行完成并且失败的状态。此三个状态不能相互逆转。
2)promise对象必须实现then方法,可以说then是promise的核心,而且then方法必须返回一个promise对象,同一个promise对象可以注册多个then方法,并且回调的执行顺序和他们注册的顺序一致。
3)then方法接收两个回调函数,他们分别是成功时的回调和失败时的回调。
value值表示的是异步执行成功之后在promise函数中获取的值,不确切的说就是可以获取该函数的私有变量,将promise的值获取过来之后在then中可以实现值的相应应用。
以下示例表示promise的不可逆性和链式调用:
相关阅读
如何使用try{}catch(){} /*当里面有错误时不抛出错误,而且运行catch里面的语句,try里面错误语句的后续代码不再运行,但是不影响后续
js中innerHTML与innerText的用法与区别用法:<p id="test"> <span style="color:red">test1</span> test2</p>在JS中可以使用
/** 设置指定键对值的系统属性* setProperty (String prop, String value);* * 参数:* prop - 系统属性的名称。* value - 系统属
之前的文章,稍微讲了一下Estimator的用法,也提到Estimator的数据处理使用的是tf.data这两个模块是Tensorflow初学者必须掌握的内
一、为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了。后来,代码越来越多,一个文