JavaScript async/await入门
2018年6月26日只能在async方法中使用await
关键字。为了使用await一个异步方法,必须把外层函数改为async
,那么外层都一直要async了。打破这个循环的方法是不用await这个语法糖,改为.then
。
定义
JavaScript异步方法和C#的定义类似。若有返回值类型T,则
async T function(){..}
等同于
Promise<T> function(){..}
对于无返回值的方法,
async void function(){..}
等同于
Promise function(){..}
并不是加上async关键字就变成异步了
由定义可见,原先的同步方法加上async关键字并不会变成异步,最多只能称作披着async外衣的同步方法。
下面代码首先定义一个有async关键字修饰方法,方法体内连续输出hello 100次,最后的返回值是finish。初学者可能以为,因为有async关键字修饰,代码可能会先输出finish,后输出hello 99。实际上,JavaScript引擎永远都先执行for循环,最后执行return "finish"
。更加意外的是,console.log(r)输出的是Promise
承诺对象。”finish”字符串似乎被吞没了。
async function sayHello(){
for(let i=0;i<100;i++)
console.log("hello " + i);
return "finish";
}
let r =sayHello();
console.log(r);
真正的async方法
这里借助jQuery.Deferred()创建承诺。
async function sayHello() {
let deferred = $.Deferred();
setTimeout(() => {
console.log("hello");
deferred.resolve();
}, 100);
return deferred.promise();
}
sayHello().then(() => {
console.log("world");
});
不做事的Promise对象
用以下代码可以创建一个不做任何事的Promise对象。
var promise = new Promise(resolve=>{resolve();});
[…] 承接JavaScript async/await入门,JavaScript async函数必须直接返回Promise对象。显然,函数体必须有类似return new Promise(..)的语句。 […]