[JS] Promise 详解


promise 的链式调用解决了异步编程中的回调地狱问题,让异步编程变得更加直观

async/await 可以不用手写 promise, 让代码更加直观。就是简化 Promise 写法

JavaScript 的本质上是单线程的,因此在任何时刻,只有一个任务会被执行,尽管控制权可以在不同的 Promise 之间切换,从而使 Promise 的执行看起来是并发的。在 JavaScript 中,并行执行只能通过 worker 线程实现

// 在创建 Promise 对象时,参数的函数内的同步脚本会立即执行
new Promise(() => {
  console.log('promise output') // 会立刻输出
})
function async1() {
  return new Promise((resolve, reject) => {
    console.log('log on new promise')
    setTimeout(() => {
      //   console.log('async');
      return resolve('ok');
    }, 1000);
  });
}

async function main() {
  const res = await async1();
  console.log(res); // micro task
  console.log('01');
}

function m1() {
  return async1()
    .then((res) => console.log(res)) // micro task
    .then(() => console.log('01'));
}

main();
m1();
const pro = new Promise((resolve, reject) => {
  resolve('suc')
} )

// Promise.reject(new Error('xxx'))
throw new Error('xxx')

// 在非 async 函数中调用 async 函数,
// async 的作用就是声明当前函数是一个异步函数, 并且返回一个 Promise 对象
// async 函数是 AsyncFunction 构造函数的实例
async function wait() {
  await new Promise(resolve => setTimeout(resolve, 1000));

  return 10;
}

function f() {
  // 1 秒后显示 10
  wait().then(result => alert(result));
}

f();