【发布时间】:2016-12-16 10:38:25
【问题描述】:
我有一个 nodeJS 库,我在其中编写特定功能,它将调用 SOAP API 来获取信息。
我希望人们可以轻松使用该库。这样他们就可以调用:
library.requestThatService(parameters ...);
图书馆应该处理所有幕后的脏活。我希望库做的是首先可能验证给定的参数。然后根据参数构造要发送的消息(序列化?),创建签名等......最后,使用包含之前创建和签名的消息的soap客户端调用soap API。
现在我正在考虑为此使用 javascript Promises。我不确定是否应该包装整个 library.requestThatService(parameters ...) 函数以返回一个承诺,然后使用失败和成功函数(.then 在实践中)。 我真正要问的是,我应该只将 async 用于实际的异步 API 调用,还是用于整个库函数?我可以向它添加一个回调函数,而不是调用库来返回一个承诺。然后在库函数中,我应该只对发送 SOAP 请求的部分使用异步承诺。并且不包括异步部分的验证和消息创建,因为它们不是异步操作。
SOAP 客户端可能已经自己返回了一个承诺。所以我会在一个函数周围有两个承诺,我不确定这是否真的是一个好主意。那么其中一个承诺将不会被解决或拒绝。
【问题讨论】:
-
whether I should only use async for the actual async API call, or for the whole library function?- 是的,你选择哪个都可以 - 只要你不认为你可以以某种方式使异步代码同步 -
你能解释一下为什么这两个选项都很好吗?从那时起,我将包括一些不是真正异步的操作。然后我在一个函数中有两个 Promise,这听起来一点都不好
-
异步 API 函数应该返回一个 Promise,因为它们比普通的回调函数更强大、更灵活。非异步 API 函数应该返回任何有意义的正常同步返回值。你永远不需要返回两个承诺。如果您有两个并行运行的异步操作,您可以在内部使用两个 Promise,但它们将组合成一个返回的 Promise,表示两者都完成时,如
Promise.all()。 -
如果你想使用 Promise,请正确使用它们,在大多数情况下你不会有
two promises floating around a function- 你将使用 Promise 链,因为它们应该被使用。 - 如果你不明白这个,或者如果 Promise 链不是最佳解决方案,请使用回调,就像标准 nodejs 的其余部分一样。 Promise 并不总是异步编程的答案,它们是一种工具,并且像任何工具一样,最好在它们是手头工作的最佳工具时使用 -
您是否建议,如果我只是创建一个承诺链,我实际上可以将承诺用于验证和签名部分?我可以将验证和签名模块化到他们自己的函数中,并让他们返回一个承诺,我可以链接到实际的 API 调用?但是因为验证和签名不是异步操作,所以对它们使用promise是否正确?
标签: javascript node.js asynchronous promise es6-promise