背景

原来 JavaScriptawait 关键字,不仅可以用于 Promiseasync 函数,还可以用于任何一个带有 then 方法的对象。

实验

打开这个页面在线运行实验

比如下面这段代码,输入结果是这样的:

started
then
done with 100
async over

源代码如下:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  <button onclick="start()">Start</button>
  <script type="text/javascript">
    async function start() {
      console.log('started');

      try {
        const res = await fakeAsyncCompute;
        console.log('done with ', res);
      } catch (ex) {
        console.log('ex = ', ex);
      } finally {
        console.log('async over');
      }
    }
        
    const fakeAsyncCompute = {
      then: (successCallback, errorCallback)=>{
        setTimeout(()=> {
          console.log('then'); 
          // 通过调用 successCallback 可以将 try 块里的代码执行完
          successCallback(100);
          // 如果想将执行流程跳转到上面的 catch 块,可以调用 errorCallback
          // errorCallback(200);
        }, 3000);
      }
    }
  </script>
</body>
</html>