await/promise

Node里只有一条 JS 执行线程(多进程PM下除外),假设有java代码:result r = db.query(sql) 要执行1分钟,这一分钟内并不会阻塞java服务继续接收别的请求,因为JVM会把这个 Java 线程挂起,CPU切去跑别的线程,数据库返回后再把这条线程唤醒 但是在Node里,只有一条执行线程,没有所谓「挂起-唤醒」机制 如果也像java那样直接等待,就必须让这条唯一的线程停止在原地,结果就是整个node啥也干不了,新的HTTP请求,定时器都进不来,看起来就和死机了一样

所以Node只能利用 await/then(两者一样,只是写法不同) 这类机制,让用户来处理,语言层面会先给你一个占位符(promise),如果你想把CPU切到其他线程,并同时等待,就需要用 await 告诉事件循环,等这个占位符兑现了再把我这段代码塞回队列继续跑

node 可以通过 PM 来开启进程池,把每个核心吃满,一个核心一个进程,比如并发查4次DB,可以丢给四个CPU去做,但要切记,一个核心里面一样也只有一个线程,所以也还是需要 await/promise这种处理

async 这个关键词的作用是把函数的返回值包装成promise,底层会调用:Promise.resolve(value) Q: 为什么要这样做? 这个写法会简化处理,统一返回promise避免忘记,比如原来是异步,你给改成同步了,那调用者也要改,很麻烦 举例说明:

// 手动返回 Promise:漏写一行,导致有时给对象
function getUser(id) {
  if (cache[id]) return cache[id];            // ❌ 这里忘了 Promise.resolve
  return fetch(`/user/${id}`).then(r => r.json());
}

// 调用者 50% 概率踩坑

调用者正确做法

const user = maybe.then ? await maybe : maybe;  // 恶心