我正在学习 promises,我绝对想确保在继续之前了解它们的用法。我正在使用一个库来提供在线服务,该服务具有返回承诺的功能。
我阅读的几乎所有示例都使用链式 then()
函数中的已解析数据
const result = Library.functionReturningAPromise()
result.then(function(res) {
const obj = new Example(res)
return obj
}).then(function(ob) {
// do the rest of the logic within these then() functions
})
或者在 async
函数中使用解析后的数据
async function test() {
const result = await Library.functionReturningAPromise()
const obj = new Example(result)
// do the rest of the logic
}
我想知道是否有任何方法可以在“正常”同步代码中使用已解决承诺中的数据
const result = Library.functionReturningAPromise()
// do something to resolve the promise
const obj = new Example(result)
或者,如果您需要始终在 async
函数中“包装” 所有 使用来自已解决承诺的数据的逻辑。
原文由 myol 发布,翻译遵循 CC BY-SA 4.0 许可协议
在处理异步响应时,没有办法编写完全同步的代码。一旦任何操作是异步的,您就必须使用异步技术来处理响应,并且不能对其进行同步编程。您必须学习异步编程。
您显示的两个选项(
.then()
或async/await
)是您处理返回承诺的两个选择。如果您想使用
await
以便您可以编写看起来同步的代码来处理承诺,那么所有这些代码都必须在async
函数中。而且,一旦您离开该函数的范围(例如想要返回一个值),您就会从async
函数返回一个承诺,并且必须再次处理该承诺。没有办法解决这个问题。这只是在 Javascript 中必须学习的东西。一段时间后,它变成了第二天性。
如您所知,您可以使用
async
和await
来获得一些看起来同步的逻辑流,但是有一些事情可以确保您在执行此操作时理解。从你的例子:async
声明的所有函数返回一个承诺。这是您从他们那里获得的唯一回报。如果调用者正在寻找返回值或想知道异步操作何时完成或正在寻找错误,他们必须使用返回的承诺.then()
,.catch()
或再次使用await
在async
函数中。await
并且您需要在本地处理拒绝,那么您需要将它们包装在try/catch
(与同步异常非常相似的语法)中。这是使用
try/catch
和await
在本地处理错误的示例:下面是调用者处理错误的示例: