注意!!!
使用es7 async await presets必须使用stage-3,否则不会执行
1、使用了promise,不使用promise,可以用一个callback,不过如果callback也是一个异步就会形成回调地狱
比如
var a = 0;
setTimeout({
a = 1
console.log(a);
setTimeout({
a = 2
console.log(a);
setTimeout({
a = 3
console.log(3);
},1000)
},1000)
},1000)
这段代码可以使用回调函数处理一下,代码如下
var a = 0;
function callback2(){
console.log(a)
setTimeout({
a = 3
},1000)
}
function callback1(){
console.log(a)
setTimeout({
a = 2
callback2();
},1000)
funcition timer(){
setTimeout({
a = 1
callback1();
},1000)
}
timer();
这就形成了回调地狱,这段代码的执行效果是1秒后输出1,在一秒后输出2,在一秒后输出3,这段代码与下面的这段代码的执行是不一样的
setTimeout({
console.log(1);
},1000)
setTimeout({
console.log(2);
},1000)
setTimeout({
console.log(3);
},1000)
这段代码是会在一秒后同时输出1,2,3,不理解的话请参照下方链接
如果你使用promise的话,就不会陷入回调地狱了
function time(){
return new Promise(function(resolve,reject){
setTimeout(function(){
a = 1;
resolve(a);
},1000)
})
}
function callback1(){
return new Promise(function(resolve,reject){
setTimeout(function(){
a = 2;
resolve(a);
},1000)
})
}
function callback3(){
return new Promise(function(resolve,reject){
setTimeout(function(){
a = 3;
resolve(a);
},1000)
})
}
timer().then(function(data){
console.log(data) //一秒后输出1
return callback1()
}).then(function(data){
console.log(data) //一秒后输出2
return callback2()
}) .then(function(data){
console.log(data) //一秒后输出3
})
这里使用async await又该怎么去写呢,代码如下:
var a = 0;
async function time(){
let response = await new Promise(function(resolve,reject){
setTimeout(function(){
a = 1;
resolve(a);
},1000)
});
console.log(response);
return response;
}
async function callback1(){
let response = await time()
return response;
}
all的用法
Promise的all方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调。我们仍旧使用上面定义好的runAsync1、runAsync2、runAsync3这三个函数,看下面的例子:
Promise
.all([runAsync1(), runAsync2(), runAsync3()])
.then(function(results){
console.log(results);
});
- 1
- 2
- 3
- 4
- 5
用Promise.all来执行,all接收一个数组参数,里面的值最终都算返回Promise对象。这样,三个异步操作的并行执行的,等到它们都执行完后才会进到then里面。那么,三个异步操作返回的数据哪里去了呢?都在then里面呢,all会把所有异步操作的结果放进一个数组中传给then,就是上面的results。所以上面代码的输出结果就是:
有了all,你就可以并行执行多个异步操作,并且在一个回调中处理所有的返回数据,是不是很酷?有一个场景是很适合用这个的,一些游戏类的素材比较多的应用,打开网页时,预先加载需要用到的各种资源如图片、flash以及各种静态文件。所有的都加载完后,我们再进行页面的初始化。
https://www.jianshu.com/p/e5225ba4a025
其实很简单,一定得去理解,异步重开线程嘛,跟ajax其实一样的
这里是使用了promise的代码
var b = 2
function runAsync(){
return new Promise(function(resolve,reject){
setTimeout(function(){
b = 6
resolve(b)
}, 2000);
})
}
runAsync().then(function(data){console.log(data)); //6
下面使用了es7 async await 的代码,其实核心还是promise,只是promise的再次封装
var b = 2;
async function runAsync(){
const testResult = await new Promise(function(resolve,reject){
setTimeout(function(){
b = 6
resolve(b)
}, 2000);
})
console.log(testResult);
}
runAsync() //6
其实真的非常相似,只是舍弃了promise.then更加麻烦的写法
async、await串行并行处理
串行:等待前面一个await执行后接着执行下一个await,以此类推
async function asyncAwaitFn(str) {
return await new Promise((resolve, reject) => {
setTimeout(() => {
resolve(str)
}, 1000);
})
}
const serialFn = async () => { //串行执行
console.time('serialFn')
console.log(await asyncAwaitFn('string 1'));
console.log(await asyncAwaitFn('string 2'));
console.timeEnd('serialFn')
}