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

ner*_*lip 5 javascript promise

我不知道SO是否适合这样的问题.

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

但是,我使用它们越多,我不知道何时不使用它们.

例如,我写了一段这样的代码(用于本地脚本查询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) => {}
 ...
Run Code Online (Sandbox Code Playgroud)

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

有规则要知道吗?我没有得到的行为?

换句话说,我什么时候知道我的脚本在function没有正确参数的情况下运行的"风险" (argument从另一个function没有"结束"的情况下返回)...?

谢谢.

jfr*_*d00 2

当您拥有完全同步的代码(没有尝试跟踪完成情况的异步操作)时,您不想使用 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
 }
 ...
Run Code Online (Sandbox Code Playgroud)

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