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();});