Javascript 使用';承诺';与不使用';承诺';:在哪些情况下?

Javascript 使用';承诺';与不使用';承诺';:在哪些情况下?,javascript,promise,Javascript,Promise,我不知道这样一个问题是否合适 我知道一点承诺,我在节点/Express环境中使用它们来“修复”查询数据库时节点的异步行为(=等待DB应答,然后做些事情) 然而,我使用它们越多,不使用它们时知道的就越少。 例如,我编写了这样一段代码(用于查询googlematrix API)的本地脚本 。。。。 对于(var i=0;i{} ... 我不知道在这里使用承诺是否有意义 有什么规则要知道吗?一种我不懂的行为 换言之,我什么时候知道脚本在没有正确参数的情况下运行函数(参数从另一个未“结束”的函数返回)

我不知道这样一个问题是否合适

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

然而,我使用它们越多,不使用它们时知道的就越少。

例如,我编写了这样一段代码(用于查询
googlematrix API
)的本地脚本

。。。。
对于(var i=0;i{}
...
我不知道在这里使用
承诺是否有意义

有什么规则要知道吗?一种我不懂的行为

换言之,我什么时候知道脚本在没有正确参数的情况下运行
函数
参数
从另一个未“结束”的
函数
返回)存在“风险”


谢谢。

通常您自己不使用本机promise,您使用promise是因为您当前使用的需要一些异步过程:

  • http请求客户端
  • 数据库/其他请求服务器端
通常,您为它们使用的连接器/库已经向您施加了承诺或回调,您可以在其中解析承诺,以便在任何地方使用承诺

另一种非常特殊的异步过程是,当客户端执行一些繁重的操作(通常不应该这样做!)时,需要将其设置为在后台运行,并异步解决

你可以用一个承诺,当它完成时解决它


如果您不明白我所说的“在后台运行”是什么意思,那么请参见本文,因为Javascript是单线程的,没有这回事,它只是对它的模拟。

当您拥有完全同步的代码时(没有尝试跟踪完成的异步操作),您不想使用承诺

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

另外,
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
 }
 ...
。。。。
对于(var i=0;i

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

您使用承诺来帮助处理异步进程。如果没有异步,那么就没有必要使用承诺。在您的示例中,
来源
目的地
id
是字符串,而不是承诺。将这些值传递给
承诺没有意义。所有的
。我认为您应该继续了解承诺,这样你才能真正理解他们在解决什么问题。然后问“什么时候不使用承诺”应该很明显。在上述情况下,您不会使用承诺,因为它不是异步的。您通常会在需要回调或等待某些异步行为完成时使用承诺。这没有意义,
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
 }
 ...