【问题标题】:Javascript: How to determine whether to promisefy a function?Javascript:如何确定是否promisify一个函数?
【发布时间】:2017-08-14 22:33:08
【问题描述】:

考虑小的辅助函数,其中一些是异步/承诺的明显候选者(我想我理解它们):

exports.function processFile(file){
  return new Promise(resolve => {
    // super long processing of file
    resolve(file);
  });
}

此时:

exports.function addOne(number){
  return new Promise(resolve => {
    resolve(number + 1);
  });
}

看起来有点矫枉过正。

确定他们是否应承诺履行其职能的规则是什么?

【问题讨论】:

标签: javascript asynchronous promise


【解决方案1】:

如果我需要按特定顺序执行多个异步函数,我通常会使用 Promise。例如,如果我需要发出三个请求并等待它们全部返回,然后我才能合并数据并处理它们,那么这就是 Promise 的一个很好的用例。在您的情况下,假设您有一个文件,并且您需要等到服务中的文件和元数据都被加载,您可以将它们放入一个承诺中。

如果您希望优化长时间运行的进程的操作,我会更多地研究网络工作者,而不是使用 Promise。它们在 UI 线程之外运行,并使用消息将其进度传递回 UI 线程。它是基于事件的,但不需要承诺。唯一需要注意的是,您无法在 Web Worker 内部的 DOM 上执行操作。

更多关于网络工作者的信息:https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers

【讨论】:

  • 这并不能真正回答问题。
【解决方案2】:

确定他们是否应承诺履行其职能的规则是什么?

其实很简单:

  • 当函数执行异步操作时,它应该为结果返回一个承诺
  • 当函数只做同步的事情时,它不应该返回一个承诺

【讨论】:

  • 我想这就是重点:除了速度之外,是什么让 X+1 同步?
  • 它返回后什么都不做(“在后台”)?我以为你知道what "asynchronous" means。一般来说,默认情况下一切都是同步的,you have to know it when it's not.
  • 一个执行异步操作并且不需要按特定顺序完成或等待其他事件完成的函数是过度杀伤并且可能是不必要的开销。可以使用一个简单的回调来代替。
  • @nixkuroi 你能详细说明一下吗?你是说对于某些异步函数,回调比返回承诺更好?
  • @nixkuroi 看来你是missing the point of promises。 Promise 是结果值,它们比回调更容易和更安全。他们甚至有hardly any overhead。但无论如何,这种讨论是无关紧要的,OP 已经决定使用承诺。如果他使用回调,他的问题将是“如何确定我的函数是否应该接受回调?”。
猜你喜欢
  • 2021-08-01
  • 2019-10-15
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
  • 2020-09-19
  • 2011-08-17
  • 1970-01-01
相关资源
最近更新 更多