美文网首页
js事件机制与Promise

js事件机制与Promise

作者: 摸摸大海参 | 来源:发表于2019-04-25 17:06 被阅读0次

    (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实例中哪个先执行完成决定的,先执行完的再前面,后执行完的在后面。

    相关文章

      网友评论

          本文标题:js事件机制与Promise

          本文链接:https://www.haomeiwen.com/subject/jnszgqtx.html