【问题标题】:Using 'Promise' vs. NOT using 'Promise' : in which cases?使用“承诺”与不使用“承诺”:在哪些情况下?
【发布时间】:2016-12-29 04:51:11
【问题描述】:

我不知道 SO 是否适合提出此类问题。

我知道一点Promises,我在Node/Express 环境中使用它们来“修复”Node 在查询数据库时的异步行为(= 等待数据库回答,然后做一些事情)。

但是,我越用,越不知道什么时候不用。

比如我写了一段这样的代码(本地脚本查询Google Matrix API)...

 ....
 for (var i = 0; i < rows.length; i++) { // loop over a CSV file by line
    var cell = rows[i].split(/;/)
    var origin = cell[1]
    var destination = cell[2]
    var id = cell[0]
    Promise.all([origin, destination, id]).then((p) => {}
 ...

我不知道在这里使用Promise.all 是否有意义...

有规则要知道吗?我不明白的行为?

换一种说法,我什么时候知道我的脚本运行 function 没有正确的参数(argument 是从另一个 function 返回的“风险”,这不是“结束”)...?

谢谢。

【问题讨论】:

  • 您使用 Promise 来帮助处理异步进程。如果没有任何异步,那么就没有必要使用 Promise。在您的示例中,origindestinationid字符串,而不是承诺。将这些值传递给Promise.all 是没有意义的。我认为你应该继续了解 Promise,这样你才能真正了解它们正在解决的问题。那么“什么时候不使用它们”的问题应该是显而易见的。
  • 在上面的例子中你不会使用 Promises,因为它不是异步的。您通常会在需要回调或等待某些异步行为完成的任何时候使用 Promise。
  • 这没有意义,Promise.all(list) 返回一个承诺,该承诺会在list 上的所有承诺完成后运行,但是您传递的是...单元格的列表?文本?当然不是承诺。
  • “修复”异步行为不要修复它,喜欢它。 async 很棒而且非常有用,你只需要了解你可以用它做什么。
  • I use them ... to 'fix' the asynchronous behavior - 实际上,通过使用 Promises,您是在 使用 异步行为 - 没有什么可以使异步操作同步 - 一旦你异步,你就不能回去了

标签: javascript promise


【解决方案1】:

当你有完全同步的代码(没有你试图跟踪完成的异步操作)时,你不想使用 Promise。

尝试在同步代码中使用 Promise 只会给代码逻辑增加不必要的复杂性,并减慢代码的执行速度。对于所有同步代码,无需等待完成或协调完成,因此您只需执行代码并立即获得结果。添加 Promise 只会使您的代码不必要地复杂化。

此外,Promise.all() 期望您传递一个承诺数组,而不是像您这样做的值数组,除了不必要之外,您所做的也是不正确的。

所以,真的没有理由不这样做:

 ....
 for (var i = 0; i < rows.length; i++) { // loop over a CSV file by line
    var cell = rows[i].split(/;/)
    var origin = cell[1]
    var destination = cell[2]
    var id = cell[0]
    // operate on id, destination and origin here
    // no need to wait on a promise before doing so
 }
 ...

Promise 将与异步操作一起使用,例如数据库操作、文件操作、网络操作、定时操作等...您可以使用它们来了解单个异步操作何时完成或协调多个操作(一些它们是异步的)。

【讨论】:

    【解决方案2】:

    一般你自己不使用原生 promise,你使用 promise 是因为你当前使用的需要一些异步进程:

    • http请求客户端
    • 数据库/其他请求服务器端

    通常,您为它们使用的连接器/库已经向您强加了一个 Promise 或回调,您可以在其中解决 Promise 以便在任何地方使用 Promise。

    另一种非常具体的异步过程是当您的客户端做一些繁重的事情时(通常不应该这样做!)并且您需要让它像在后台运行并异步解决它。

    你可以使用一个 Promise 并在它完成后解决它。

    如果你不明白我所说的“在后台运行”是什么意思,请参阅SO's post,因为 Javascript 是单线程的,所以没有这样的东西,它只是对它的模拟。

    【讨论】:

      猜你喜欢
      • 2016-06-16
      • 1970-01-01
      • 2016-07-27
      • 2013-11-03
      • 1970-01-01
      • 2015-10-11
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多