(ps:不对之处,敬请指正!!!)
Event-Loop
众所周知,JavaScript是单线程的,不知是哪个天才提出了Event-Loop机制来处理单线程所带来的不便。js的Event-Loop:
1、js把任务分为两种:宏任务(一般代码、setTimeout...)与微任务(Promise.then...)
2、js在运行时,先执行宏任务(个人理解宏任务分两种:同步与异步),宏任务中的同步任务执行完,就去读取微任务,再执行下一轮Event-Loop。
这也是所以为什么setTimeout会在Promise.then的后面执行!因为setTimeout属于宏任务的异步任务,在下一轮Event-Loop才执行,而Promise.then在第一轮的微任务中执行了。
Promise
ES6的一大特点是提供了Promise处理异步。
在ES6以前,通常使用回调函数去处理异步,但如果大量使用回调函数会很容易造成回调地域。Promise的出现为处理异步带来的极大的方便。
先举例,再分析:
function createPromise () {
var pro = new Promise((resolve, reject) => {
if (5 > 3) {
setTimeout(() => {
resolve('这是传过去的数据')
}, 1000)
} else {
reject('it\'s wrong')
}
})
return pro
}
createPromise().then((data) => {
console.log( '已接收:' + data) // 已接收:这是传过去的数据
})
.catch((err) => {
console.log('已接收:' + err)
})
Promise就收一个回调函数,回调函数有两个参数:resolve和reject。resolve返回一个带有已完成参数的Promise对象,并执行then方法;reject返回一个带有拒绝参数的Promise对象,执行catch方法。
Promise.all
Promise.all专门用于处理多个Promise任务。
var tasks = []
tasks.push(createPromise1())
tasks.push(createPromise2())
tasks.push(createPromise3())
Promise.all(tasks).then((res) => {
console.log(res)
})
.catch((err) => {
console.log(new Date, '已接收:' + err)
})
如果所有的Promise任务都是resolve,then方法会被执行,res是一个包含所有Promise实例resolve方法中的参数的数组;
如果有一个Promise实例是reject状态,将会执行catch,err为Promise.reject方法中的参数。
Promise.all().then方法中的res数组里面的数据顺序和Promise.all()接收到的数组顺序是相同的,即使createPromise3()完成得比createPromise1()快。
Promise.race
Promise.race与Promise.all相似,不同在于Promise.all().then方法中的结果数组是顺序的,而Promise.race().then方法中的结果数组的排序是根据Promise实例中哪个先执行完成决定的,先执行完的再前面,后执行完的在后面。
网友评论