【发布时间】:2019-05-06 14:02:37
【问题描述】:
有许多 I/O 操作——对其他服务器的请求、数据库访问、文件访问——是或应该是承诺。但是,为了封装,可能会发出服务器请求(例如向 Google recaptcha 或 Cloudinary)、数据库调用(例如 PostgreSQL、Mongo、ReDis)或只是读取文件的更高级别的调用。
理想情况下,这些格式应为:
functionCall()
.then(FC1)
.then(FC2)
.catch()
调用的父级不必知道调用的内部结构,或者是随后的 then 或 catch 子句。据我了解,它们应该类似于:
highLevelFuncionCall()
.then(()=>{
functionCall() //and all its then/catch clauses
}
.then(HLFC1)
.then(HLFC2)
.catch()
但是,它似乎并没有那样工作。无需等待 FC1 和 FC2 即可继续处理 HLFC1,即使需要先处理它们。
如何构造它以使依赖的 Promise 对更高级别的调用者不可见?
谢谢,
大卫
【问题讨论】:
-
then(resolve, reject)其中 resolve/reject 是一个返回 Promise 的函数。但是() =>´{ functionCall() }返回 undefined 并立即解决。尝试去除卷曲。 -
关于范围:不需要解析/拒绝下一个函数的内部。
functionCall可以看起来像function functionCall() { return asyncCall().then(()=>Promise.resolve()) }。它将转储任何数据,解析未定义(作为 Promise)并保持链接。 -
问题是我需要一种方法用于 functionCall 及其 then 子句 FC1 和 FC2,或者它在返回到 highLevelFunctionCall 链之前捕获要调用的错误处理程序。如何将 promise 及其 then 子句保留为原子操作?例如,如果 functionCall 读取数据库,则在 highLevelFunctionCall 处理数据时解析响应,例如验证登录。在 Angular 客户端中,当 then 子句完成时,我们最终会发出消息。我从不喜欢它,也没有看到它在服务器上的 Nodejs 中使用。
标签: javascript node.js ecmascript-6 promise es6-promise