2016-12-28 109 views
5

我不知道SO是否适合这样的问题。使用'承诺'与不使用'承诺':在哪些情况下?

我知道Promises,我在Node/Express环境中使用它们在查询数据库(=等待DB答案,然后执行某些操作)时“修复”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不是“超过”返回)有一个“风险”...?

谢谢。

+6

您使用承诺来帮助处理异步进程。如果没有异步,那么就没有必要使用promise。在你的例子中,'origin','destination'和'id'是**串**,不是承诺。将这些值传递给'Promise.all'没有任何意义。我认为你应该继续学习承诺,以便你真正理解他们正在解决哪个问题。那么“何时不使用它们”这个问题应该是显而易见的。 –

+0

您不会在上面的情况下使用Promises,因为它不是异步的。您通常会在需要回调或等待某些异步行为完成时使用promise。 –

+0

它没有任何意义,'Promise.all(list)'返回一个承诺,一旦所有的承诺在list上完成,但你传递一个单元格列表?文本?当然不是承诺。 – ranisalt

回答

2

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

试图用承诺与同步代码只增加了不必要的复杂的代码的逻辑和减慢你的代码的执行。与所有的同步代码,还有什么等待的完成或与这样你就可以只执行你的代码,并立即有结果完成协调。添加承诺会使您的代码不必要地复杂化。

另外,Promise.all()希望你传递一个promise数组,而不是像你这样做的值数组,除了是不必要的,你所做的也是不正确的。

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

.... 
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 
} 
... 

承诺将与异步操作,如数据库操作,文件操作,网络操作,定时操作,等等......你可以用使用它们来知道何时完成单个异步操作或者协调多个操作(其中一些是异步的)。

3

我通常只使用承诺,如果我使用的是一个异步过程,例如从数据库中获取数据的调用。如果你没有处理异步过程,我不能想到你需要使用承诺的情况。

1

一般不要使用本地答应自己,你使用的承诺,因为你目前使用需要一些asynchonous过程:

  • HTTP请求的客户端
  • 数据库/其他请求,服务器端

通常你使用的连接器/库已经给你一个Promise或者一个回调,你可以在这个Promise或回调中解决诺言,以便在任何地方使用promise。

另一个非常特定类型的异步处理的是,当你的客户端做一些重的东西(通常它不应该!),你需要使它像它在后台运行,并以异步方式解决。

您可以使用承诺并在完成时解决。

请参阅SO's post如果您不明白我的意思是“在后台运行”,因为Javascript是单线程的,没有这样的事情,它只是模拟它。