1、ES7:generator + promise 的语法糖 async + await
developer.mozilla.org/zh-CN/docs/…
2、async:函数修饰符 控制函数返回promise实例
3、函数内部执行报错,则返回失败的promise实例,值是失败的原因
4、自己返回一个promise,以自己返回的为主
5、如果函数内部做了异常捕获,则还是成功态
6、使用async的主要目的:是为了在函数内部使用await
7、await:后面应该放置一个promise实例「我们书写的不是,浏览器也会把其变为promise实例」,await中断函数体中,其下面的代码执行「await表达式会暂停整个async函数的执行进程并出让其控制权」;只有等待await后面的promise实例是成功态之后,才会把之前暂停的代码继续执行,如果后面的promise实例是失败的,则下面的代码就不在执行了;
8、await是异步的微任务:函数体中遇到await,后面代码该咋地咋地,但是下面的代码会暂停执行「把他们当做一个任务,放置在EventQueue的微任务队列中」
async function func() {
// await 1; //-> await Promise.resolve(1);
let result1 = await api(1000);
console.log(result1);
let result2 = await api(3000);
console.log(result2);
}
func();
9、练习题1
var resolveAfter2Seconds = function resolveAfter2Seconds() {
console.log("starting slow promise");
return new Promise(resolve => {
setTimeout(function () {
resolve("slow");
console.log("slow promise is done");
}, 2000);
});
};
var resolveAfter1Second = function resolveAfter1Second() {
console.log("starting fast promise");
return new Promise(resolve => {
setTimeout(function () {
resolve("fast");
console.log("fast promise is done");
}, 1000);
});
};
// sequential:相继的 /[sɪˈkwenʃl]/
var sequential = async function sequential() {
console.log('==SEQUENTIAL START==');
const slow = await resolveAfter2Seconds();
console.log(slow);
const fast = await resolveAfter1Second();
console.log(fast);
};
10、promise.all
var resolveAfter2Seconds = function resolveAfter2Seconds() {
console.log("starting slow promise");
return new Promise(resolve => {
setTimeout(function () {
resolve("slow");
console.log("slow promise is done");
}, 2000);
});
};
var resolveAfter1Second = function resolveAfter1Second() {
console.log("starting fast promise");
return new Promise(resolve => {
setTimeout(function () {
resolve("fast");
console.log("fast promise is done");
}, 1000);
});
};
var concurrentPromise = function concurrentPromise() {
console.log('==CONCURRENT START with Promise.all==');
return Promise.all([resolveAfter2Seconds(), resolveAfter1Second()])
.then((messages) => {
console.log(messages[0]);
console.log(messages[1]);
});
};
(1)输出console.log('==CONCURRENT START with Promise.all==');
(2)首先promise.all里面的值是for循环输出的,所以肯定会首先同步的按顺序输出:
console.log("starting slow promise"); console.log("starting fast promise");
(3)然后遇到异步宏任务resolveAfter1Second这个宏任务先到时间,执行输出 console.log("fast promise is done");
然后异步宏任务resolveAfter2Seconds这个到时间,输出 console.log("slow promise is done");
(4)最后按照传的数组的顺序输出slow和fast
11、并行输出
var resolveAfter2Seconds = function resolveAfter2Seconds() {
console.log("starting slow promise");
return new Promise(resolve => {
setTimeout(function () {
resolve("slow");
console.log("slow promise is done");
}, 2000);
});
};
var resolveAfter1Second = function resolveAfter1Second() {
console.log("starting fast promise");
return new Promise(resolve => {
setTimeout(function () {
resolve("fast");
console.log("fast promise is done");
}, 1000);
});
};
var concurrent = async function concurrent() {
console.log('==CONCURRENT START with await==');
const slow = resolveAfter2Seconds();
const fast = resolveAfter1Second();
console.log(await slow);
console.log(await fast);
};
分析:
(1)首先输出console.log('==CONCURRENT START with await==');
(2)console.log("starting slow promise"); console.log("starting fast promise");
(3)两个异步的宏任务都存储了起来;然后宏任务2先到时间,先输出 console.log("fast promise is done");然后把第二个promise的成功态变成了成功;然后第一个宏任务到时间了 ,输出 console.log("slow promise is done");接着把宏任务一变成了成功;这样输出了slow,然后输出fast
12、
var resolveAfter2Seconds = function resolveAfter2Seconds() {
console.log("starting slow promise");
return new Promise(resolve => {
setTimeout(function () {
resolve("slow");
console.log("slow promise is done");
}, 2000);
});
};
var resolveAfter1Second = function resolveAfter1Second() {
console.log("starting fast promise");
return new Promise(resolve => {
setTimeout(function () {
resolve("fast");
console.log("fast promise is done");
}, 1000);
});
};
// parallel:平行的 /[ˈpærəlel]/
var parallel = async function parallel() {
console.log('==PARALLEL with await Promise.all==');
await Promise.all([
(async () => {
let result = await resolveAfter2Seconds();
console.log(result);
})(),
(async () => {
let result = await resolveAfter1Second();
console.log(result);
})(),
]);
};
13、
var resolveAfter2Seconds = function resolveAfter2Seconds() {
console.log("starting slow promise");
return new Promise(resolve => {
setTimeout(function () {
resolve("slow");
console.log("slow promise is done");
}, 2000);
});
};
var resolveAfter1Second = function resolveAfter1Second() {
console.log("starting fast promise");
return new Promise(resolve => {
setTimeout(function () {
resolve("fast");
console.log("fast promise is done");
}, 1000);
});
};
var parallelPromise = function parallelPromise() {
console.log('==PARALLEL with Promise.then==');
resolveAfter2Seconds().then((message) => console.log(message));
resolveAfter1Second().then((message) => console.log(message));
};