如何获取Bluebird最后一个then回调返回值或初始resolve传入值?
如何获取Bluebird Promise的最终结果?
好问题!其实你没法同步直接从p变量里拿到Promise的最终结果——毕竟Promise就是为了优雅处理异步操作而生的,异步结果本来就不能像同步变量那样直接读取。不过有几种标准的异步方式,可以稳稳获取到你要的内容:
1. 用.then()链式调用
这是Promise最基础的用法,不管你是在初始resolve里传值,还是在then回调里返回新的Promise,都可以在后续的.then()中拿到最终结果:
const p = Bluebird.resolve().then(() => { return new Promise(r => setTimeout(() => r('异步结果'), 1000)); }); // 给p添加then回调获取结果 p.then(finalResult => { console.log(finalResult); // 1秒后输出"异步结果" });
这里的p本身就是一个新的Promise,它的最终resolved值就是最后一步then回调返回的Promise的结果,后续挂载的then会在结果就绪时触发。
2. 用async/await让代码更像同步写法
如果你使用ES2017及以上的环境,async/await可以让异步代码看起来更简洁,避免链式嵌套:
async function fetchResult() { const p = Bluebird.resolve().then(() => { return new Promise(r => setTimeout(() => r('异步结果'), 1000)); }); // 等待p的结果就绪 const finalResult = await p; console.log(finalResult); // 1秒后输出"异步结果" } fetchResult();
await会暂停当前async函数的执行,直到Promise变为resolved状态,然后直接返回结果,用起来就像同步读取变量一样。
注意:不要试图读取Promise的内部私有属性
你可能好奇能不能直接“检查p变量”拿到结果,比如查看它的内部属性。虽然在浏览器调试工具里,你可能会看到Promise对象有_value之类的私有字段,但这些都是Bluebird或JS引擎的内部实现细节,绝对不能在生产代码里使用:
- 不同Promise库(比如Bluebird和原生Promise)的内部结构完全不同
- 这些私有属性没有任何标准保证,随时可能被修改或移除
- 同步读取这些属性会破坏Promise的异步设计原则,容易引发竞态问题
针对你给出的三个例子,统一的解决方案都是上面两种异步方式:
- 第一个例子:
p是then返回的Promise,用.then()或await获取它的最终resolved值 - 第二个例子:
p是Bluebird.resolve()包装的Promise,同样用异步方式获取结果 - 第三个例子:
p是new Bluebird()创建的实例,resolve传入的值就是它的resolved值,还是用.then()或await获取
内容的提问来源于stack exchange,提问作者dwelle
相关产品推荐
相关产品推荐

