在 React Native 里,process.nextTick() 和 Promise.then() 的执行顺序,不能简单套用浏览器的 Event Loop 规则。关键取决于 RN 使用的 JS Runtime(Hermes / JSC)以及 RN 的调度机制。
如果是在常见的 Hermes 环境下,可以先记住:
javascript
process.nextTick(() => {
console.log('nextTick');
});
Promise.resolve().then(() => {
console.log('promise');
});
console.log('sync');
通常输出:
arduino
sync
nextTick
promise
也就是:
arduino
同步代码
↓
process.nextTick
↓
Promise.then
↓
其他异步任务
为什么?
Node.js 中,process.nextTick() 有一个专门的 nextTick queue,优先级高于 Promise microtask:
arduino
┌─────────────────────┐
│ 同步 JavaScript │
└──────────┬──────────┘
↓
┌─────────────────────┐
│ process.nextTick │ ← 更高优先级
└──────────┬──────────┘
↓
┌─────────────────────┐
│ Promise microtask │
│ queue │
└──────────┬──────────┘
↓
┌─────────────────────┐
│ timer / IO / ... │
└─────────────────────┘
但是这里有一个非常重要的 RN 特殊点:
RN 不是 Node.js
React Native 里的:
arduino
process.nextTick
并不是因为 RN 运行在 Node.js 中才存在的。RN/Metro 可能提供 Node API 的 polyfill,而不同 RN 版本、Hermes/JSC 配置下具体实现可能不同。
所以不要把下面这个 Node.js 结论无条件套到 RN:
arduino
process.nextTick > Promise.then
尤其是现代 React Native + Hermes 环境,process.nextTick 的行为需要看实际 runtime/polyfill。
你可以直接测试:
javascript
console.log('1');
process.nextTick(() => {
console.log('2 nextTick');
});
Promise.resolve().then(() => {
console.log('3 promise');
});
queueMicrotask?.(() => {
console.log('4 microtask');
});
console.log('5');
如果你的目标是解决 RN 中某段代码到底谁先执行 的问题,最好把你当前 RN 版本、Hermes/JSC,以及这段代码贴出来,我可以按 RN Event Loop → Hermes Microtask → MessageQueue → React Scheduler 给你画出完整执行链。