js之async和await
async/await 是⼀种编写异步代码的新⽅法,之前异步代码的⽅案是回调和 promise,但async/await建⽴在promise基础上。
async和await是ES7中与异步操作有关的关键字。
async
async function name([param[, param[, ... param]]]) { statements }
async 函数返回⼀个 Promise 对象,可以使⽤ then ⽅法添加回调函数。如果在函数中 return ⼀个直接量,async 会把这个直接量通
过solve()封装成 Promise 对象。
async function testAsync() {
return "hello async";
}
let result = testAsync();
console.log(result)
// Promise {<resolved>: "hello async"}
await 关键字仅在 async function 中有效。如果在 async function 函数体外使⽤ await ,会得到⼀个语法错误。
await
[return_value] = await expression;
expression: ⼀个 Promise 对象或者任何要等待的值。
await针对所跟不同表达式的处理⽅式:
Promise对象:await 会暂停执⾏,等待 Promise 对象 resolve(异步操作完成),然后恢复 async 函数的执⾏并返回解析值。
⾮Promise对象:直接返回对应的值。
function testAwait (x) {
return new Promise(resolve => {
setTimeout(() => {
resolve(x);
}, 2000);
});
}
async function helloAsync() {
var x = await testAwait ("hello world");
console.log(x);
}
helloAsync ();
// hello world
很多⼈以为await会⼀直等待之后的表达式执⾏完之后才会继续执⾏后⾯的代码,实际上await是⼀个让出线程的标志。
await后⾯的函数会先执⾏⼀遍,然后就会跳出整个async函数来执⾏后⾯js栈(后⾯会详述)的代码。等本轮事件循环执⾏完了之后⼜会跳回到async函数中等待await后⾯表达式的返回值,
如果返回值为⾮promise则继续执⾏async函数后⾯的代码,否则将返回的promise放⼊promise队列(Promise的Job Queue)。
以下摘⾃:
function testSometing() {
console.log("执⾏testSometing");
return "testSometing";
}
async function testAsync() {
console.log("执⾏testAsync");
solve("hello async");
}
async function test() {
console.log("");
const v1 = await testSometing();//关键点1
console.log(v1);
const v2 = await testAsync();
console.log(v2);
console.log(v1, v2);
}
test();
var promise = new Promise((resolve)=> { console.log("promise start.."); resolve("promise");});//关键点2
promise.then((val)=> console.log(val));
console.log("")
执⾏结果:
执⾏testSometing
promise start..
testSometing
执⾏testAsync
promise
hello async
testSometing hello async
在testSomething前增加aync:
async function testSometing() {
console.log("执⾏testSometing");
return "testSometing";
}
async function testAsync() {
console.log("执⾏testAsync");
solve("hello async");
}
async function test() {
console.log("");
const v1 = await testSometing();//关键点1
console.log(v1);
const v2 = await testAsync();
console.log(v2);
console.log(v1, v2);
}
test();
var promise = new Promise((resolve)=> { console.log("promise start.."); resolve("promise");});//关键点2
promise.then((val)=> console.log(val));
console.log("")
/////////////////////////////////////
await和async使用方法执⾏testSometing
promise start..
promise
testSometing
执⾏testAsync
hello async
testSometing hello async
和上⼀个例⼦⽐较发现promise.then((val)=> console.log(val));先与console.log(v1);执⾏了,原因是因为现在testSometing函数加了async,返回的是⼀个Promise对象要等它resolve,
所以将当前Promise推⼊队列,所以会继续跳出test函数执⾏后续代码。之后就开始执⾏promise的任务队列了,所以先执⾏
了promise.then((val)=> console.log(val));因为这个Promise对象先推⼊队列。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。