2.11JavaScript语言的异步函数

1.异步函数声明

1.1async关键字

async 关键字可以用在函数声明、函数表达式、箭头函数和方法上,以代表此函数为异步函数,并非普通函数。

await 关键字只能在以 async 关键字声明的异步函数中使用,且异步函数中至少含有一个 await 关键字,不然异步函数就毫无意义地等同于普通函数。

//函数声明
async function 函数名(参数) {
  await 表达式;
}

//函数表达式
let 变量 = async function(参数) {
  await 表达式;
};

//箭头函数
let 变量 = async (参数) => {
  await 表达式;
};

//方法
class 类名 {
  async 方法名(参数) {
    await 表达式;
  }
}

1.2await关键字

await 表达式;

await 关键字后的表达式可以是 实现了 Thenable 接口的对象(期约对象也属于其中一种) 或 任意类型的值。

如果是实现了 Thenable 接口的对象(期约对象也属于其中一种),则由 await 来“解包”。

await 关键字接收一个期约对象 p 时,表达式 await p 会一直等到 p 落定(settled)。如果 p 解决(resolved),那么 await p 表达式的值就是解决 p 的值。如果 p 被拒绝(rejected),那么 await p 表达式就会抛出拒绝 p 的异常。

如果是任意类型的值,则会被Promise.resolve()包装成一个期约对象,当作已经解决(resolved)的期约。

我们通常并不会使用 await 关键字来接收一个保存期约的变量,更多的是把它放在一个会返回期约对象的函数调用前面。

function resolveAfter2Seconds() {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve('resolved');
    }, 2000);
  });
}

async function asyncCall() {
  console.log('calling');
  const result = await resolveAfter2Seconds();
  console.log(result);
  // Expected output: "resolved"
}

asyncCall();

//输出
calling
resolved

2.参数

异步函数的参数具有与普通函数一样的正常行为。

3.返回值

异步函数的返回值可以是 实现了 Thenable 接口的对象(期约对象也属于其中一种) 或 任意类型的值。

如果是实现了 Thenable 接口的对象(期约对象也属于其中一种),则由提供给 then() 的处理程序 来“解包”。

如果是任意类型的值,则会被Promise.resolve()包装成一个期约对象,当作已经解决(resolved)的期约。

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/javascript/javascriptlang/21545.html

(0)
上一篇 2020年9月10日 16:32
下一篇 2020年9月12日 14:52

相关推荐

  • 2.2JavaScript原始类型之字符串(String)

    1.单引号字符串和双引号字符串 JavaScript 语言的单引号字符串与双引号字符串一样,没有区别,所以以下一并讲解。 单引号字符串和双引号字符串支持所有转义序列。 单引号字符串和双引号字符串不支持对应引号内部的空格。 单引号字符串和双引号字符串不支持对应引号内部的字符串插值。 单引号字符串和双引号字符串不支持带标签…

  • 1.3JavaScript语言的分隔符(Separator)和运算符(Operator)

    1.分隔符 分隔符 名称 描述 ; 分号 语句分隔作用 2.一元运算符 运算符 名称 描述 +a 取正 a 的值本身。 -a 取负 a 的负值。 ++a 前递增 a 的值加1,然后返回 a。 –a 前递减 a 的值减1, 然后返回 a。 a++ 后递增 返回…

  • 2.10JavaScript引用类型之期约(Promise)

    1.创建期约对象 创建期约对象时,Promise()构造函数接受一个执行器(executor)函数作为参数。 执行器(executor)函数的签名如下: resolve 与 reject也是函数。这两个函数的签名很简单:接受任何类型的单个参数。 2.期约对象状态 期约对象表示一个异步操作的结果,在不同的状态下会有不同的…

发表回复

登录后才能评论