2

我对 node.js 的异步性质感到困惑。我正在其中编写一个小项目,而我之前的(同步)编程经验妨碍了我。

我应该如何决定是否/在哪里编写异步代码?

例如,我有一个带有字段的模型,其中每个都有一些验证规则:

model = { title: text_validation, 
  subtitle: text_validation }

text_validation = { max_len: 10,
  required: true,
  url: true }

当我验证模型时,我会遍历所有字段,检查规则是否通过 - 这些是非常快速的功能。

Model.validate = function() {
  validator = {};
  fields = Object.keys(Model);
  fields.forEach(function(field) {
    validator[field_name] = field.validate();
  });
}

Field.validate = function() {
  validator = [];
  rules.forEach(function(rule) {
    if (rule is not valid)
      validator.push(rule)
  });

  return validator;
}

我应该使用具有如此短而快速迭代的回调吗?

这里的界限在哪里?node.js 应该始终是异步的,或者如果它足够快,我可以允许同步循环或 w/e 吗?如果可能,请参考何时何地使用同步/异步的示例。

4

2 回答 2

6

你可能不应该。在大多数情况下,只有在等待应用程序外部的某些内容(主要是文件、数据库和网络操作)时才需要异步逻辑。异步延迟应用程序中的代码不会给您带来任何性能优势,因为您的代码在某些时候仍需要运行。

于 2012-06-27T12:28:34.213 回答
2

我已经在评论中说过,但我认为举个例子也是个好主意。

回调异步操作的概念是不同的,尽管是相关的。forEach您使用的 循环根本不是异步的。以下是或多或少的forEach外观定义:

Array.prototype.forEach = function(callback) {
    var l = this.length;
    for (var i = 0; i < l; i++)
        callback(this[i], i);
};

如您所见,其中没有任何异步内容。在callback循环中一步一步地同步执行。

那么如何使循环异步呢?好吧,你可以试试这个:

Array.prototype.asyncForEach = function(applier, finished) {
    var self = this;
    var l = self.length;
    var call = function(i) {
        process.nextTick(function() {
            applier(self[i], i);
            if (i == l-1)
                finished();
            else
                call(i+1);
        });
    }
    call(0);
};

你可以像这样使用它:

var x = [1,2,3,4,5,6,7,8,9,10];
x.asyncForEach(function(el, index) {
    /* apply function to each el and index */
    console.log(el);
}, function() {
    /* This will be called when the loop finishes! */
    console.log('Finished!');
});
/* Let us check whether the loop is really asynchronous.
   The following code should fire BEFORE loop! */
console.log('Is it asynchronous?');

如您所见,它并不像forEach. 但这允许其他代码在循环的迭代之间运行(process.nextTick方法的魔力)。因此,您获得了High Availability,但代价是循环完成需要更多时间。请注意,可以在迭代之间修改数组,这可能会导致您的应用程序崩溃。:D

正如我在评论中所说:我从来没有见过一个循环工作这么长时间,以至于它实际上需要变成异步循环。而且我处理了一些我处理了很多的市场数据(尽管使用 Python,而不是 JavaScript - 这可能是一个原因)。正如 lanzz 所评论的,如果循环花费了太多时间,那么分叉它可能是一个好主意。或者创建一个用某种高效语言(C?)编写的 WebService(或Node.JS 插件)。

于 2012-06-28T06:46:31.083 回答