**场景分析:**
StoryCraft 场景:生成文字 -> (并行) 生成图片 + 生成语音。
如果不希望图片挂了导致语音也不播放:
```js
const results = await Promise.allSettled([genImage(), genAudio()]);
const image = results[0].status === 'fulfilled' ? results[0].value : defaultImage;
const audio = results[1].status === 'fulfilled' ? results[1].value : null;
```
**Promise.all 原理:**
它返回一个新的 Promise。内部维护一个计数器 `count`。
遍历数组,对每个 item 也就是 `Promise.resolve(item).then(...)`。
每成功一个,`count++`。当 `count === length`,resolve 结果数组。
一旦 catch 到错误,直接 reject 外层 Promise。