js中的promise

2019-08-26  本文已影响0人  13号的下雪天

Promise 是 JavaScript 语言提供的一种标准化的异步管理方式,它的总体思想是,需要进行的IO,等待或者其他异步操作的函数,不返回真是的结果,而返回一个“”承诺“”,函数的调用方可以在合适的时机,选择等待这个承诺兑现,(通过Promise的then方法实现)
Promise 的基本用法示例如下

function sleep (duration){
  return new Promise(function(resolve,reject){
       setTimeout(resolve,duration);
  })
}
sleep(1000).then(()=> console.log("finished"))

接下来我们试试跟 setTimeout 混用的 Promise,在这段代码中,我设置了两段互不干扰的异步操作:通过setTimeout执行console.log('d'),通过promise执行console.log('c')

var r = new Promise(function(resolve,reject){
  console.log('a')
  resolve ()
})
setTimeout(()=>console.log('d',0)
r.then(()=>console.log('c'));
console.log('b')

这段代码的执行结果是a,b,c,d,其原因在于Promise产生的是javaScript引擎内部的微任务,而setTimeout是浏览器API,它产生宏观任务,微任务始终先于一个宏观任务
为证实这一结果我们可以设计一个实验,执行一个耗时一秒的promise

    setTimeout(()=>console.log("d"), 0)
    var r = new Promise(function(resolve, reject){
        resolve()
    });
    r.then(() => { 
        var begin = Date.now();
        while(Date.now() - begin < 1000);
        console.log("c1") 
        new Promise(function(resolve, reject){
            resolve()
        }).then(() => console.log("c2"))
    });

执行结果为c1,c2,d

在ES6语法当中又新增加了async/await
async/await 是 ES2016 新加入的特性,它提供了for,if等代码结构来编写异步的方式。它运行的基础是promise
它的用法

function sleep(duration) {
    return new Promise(function(resolve, reject) {
        setTimeout(resolve,duration);
    })
}
async function foo(){
    console.log("a")
    await sleep(2000)
    console.log("b")
}

上一篇 下一篇

猜你喜欢

热点阅读