如何在无法返回Promise的函数内获取JS Promise的解析值?
问题解答
一、代码执行结果
这段代码的console.log会输出**'unresolved'**。
原因是JavaScript的单线程异步执行机制:crazyPromse是带延迟的异步操作,它的then回调要1秒后才会执行,但函数promiseFulfilled会优先执行完同步代码——也就是直接返回初始值'unresolved',此时回调还没来得及修改definiteAnswer。
二、如何让函数返回Promise的解析值?
首先必须明确:JavaScript里异步操作的结果,不可能通过同步函数直接返回具体值。异步操作不会阻塞主线程,函数在异步任务完成前就已经执行完返回步骤了,这是语言执行机制的限制。
如果严格要求函数不能返回Promise,只能换思路处理:
- 改用回调函数:把需要使用结果的逻辑放到回调中执行,示例:
promiseFulfilled = (arg, callback) => { crazyPromse(arg) .then(neededAnswer => { callback(neededAnswer) }) } // 调用方式 promiseFulfilled(arg, (result) => { console.log(result) // 这里会输出'desired result' }) - 若能接受函数返回Promise(这是处理异步的标准方式),可以用
async/await简化写法:async function promiseFulfilled(arg) { return await crazyPromse(arg) } // 调用时需通过then或await接收结果 promiseFulfilled(arg).then(result => console.log(result)) // 或者在async函数内使用await async function logResult() { console.log(await promiseFulfilled(arg)) } logResult()
内容的提问来源于stack exchange,提问作者Richard Lay
相关产品推荐
相关产品推荐

