异步函数是JavaScript中函数的子集吗?

ccl*_*d44 0 javascript async-await

据我所知,async function表达式返回一个AsyncFunction对象.

  1. AsyncFunction继承Function吗?
  2. 是否可以使用异步函数代替函数?(例如作为回调参数)如果不是,那可能是一个可能的陷阱?

Bar*_*mar 5

异步函数基本上只是一个自动转换为返回promise而不是普通值的函数.它还可以在await内部用作解析另一个异步函数返回的promise的简写.

  1. 是.如下所示,它的类型是function,它是一个实例Function.

async function afunc() {
  return 3;
}

console.log(typeof afunc);
console.log(afunc instanceof Function);
Run Code Online (Sandbox Code Playgroud)

  1. 是的,您可以将其用作回调.MDN显示了使用异步函数的示例setTimeout.

var resolveAfter2Seconds = function() {
  console.log("starting slow promise");
  return new Promise(resolve => {
    setTimeout(function() {
      resolve(20);
      console.log("slow promise is done");
    }, 2000);
  });
};

var resolveAfter1Second = function() {
  console.log("starting fast promise");
  return new Promise(resolve => {
    setTimeout(function() {
      resolve(10);
      console.log("fast promise is done");
    }, 1000);
  });
};

var sequentialStart = async function() {
  console.log('==SEQUENTIAL START==');
  const slow = await resolveAfter2Seconds(); // If the value of the expression following the await operator is not a Promise, it's converted to a resolved Promise.
  const fast = await resolveAfter1Second();
  console.log(slow);
  console.log(fast);
}

var concurrentStart = async function() {
  console.log('==CONCURRENT START with await==');
  const slow = resolveAfter2Seconds(); // starts timer immediately
  const fast = resolveAfter1Second();

  console.log(await slow);
  console.log(await fast); // waits for slow to finish, even though fast is already done!
}

var stillSerial = function() {
  console.log('==CONCURRENT START with Promise.all==');
  Promise.all([resolveAfter2Seconds(), resolveAfter1Second()]).then(([slow, fast]) => {
    console.log(slow);
    console.log(fast);
  });
}

var parallel = function() {
  console.log('==PARALLEL with Promise.then==');
  resolveAfter2Seconds().then((message)=>console.log(message)); // in this case could be simply written as console.log(resolveAfter2Seconds());
  resolveAfter1Second().then((message)=>console.log(message));
}

sequentialStart(); // takes 2+1 seconds in total
// wait above to finish
setTimeout(concurrentStart, 4000); // takes 2 seconds in total
// wait again
setTimeout(stillSerial, 7000); // same as before
// wait again
setTimeout(parallel, 10000); // trully parallel
Run Code Online (Sandbox Code Playgroud)