【问题标题】:NodeJS - using Promises for API callsNodeJS - 使用 Promises 进行 API 调用
【发布时间】: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


【解决方案1】:

我应该只将 async 用于实际的异步 API 调用,还是用于整个库函数?

是的 - 总是在最低级别承诺!你会想自己使用承诺的力量,不是吗?

SOAP 客户端可能已经自己返回了一个承诺。所以我会在一个函数周围有两个承诺,我不确定这是否真的是一个好主意。

确实,将返回承诺的调用包装在另一个 new Promise 调用中甚至是 exceptionally bad idea

【讨论】:

  • 这感觉又对了,但它还没有完全回答这个问题。然后我应该将回调附加到库的主函数吗?这样库函数本身就不会返回承诺?但是在库的 main 函数中完成的 api 调用会返回一个 promise,但这个 promise 不会是 main 函数的返回值。由于验证和签名也可能失败,因此它们不会返回承诺。
  • 不,您将在 api 调用上使用承诺链,就像您希望您的用户在您的库上使用承诺链一样。如果验证和签名在没有异步的情况下会失败,请查看over here
  • 好的,所以可以从同步操作中返回一个 Promise。我会让整个库返回一个 promise,甚至库执行的一些函数也不是异步操作。
  • 是的。 “有时同步”是very bad idea,所以我们总是返回一个promise。
猜你喜欢
  • 2016-07-30
  • 2013-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多