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")
}