Node.js:编写干净简单的回调代码有哪些技巧?

Duk*_*gal 27 javascript node.js

node.js代码以变成回调意大利面而闻名.

有哪些最好的技术可以克服这个问题,并在node.js中编写干净,不复杂,易于理解的回调代码?

x'E*_*'ES 8

看看Promises:http://promises-aplus.github.io/promises-spec/

这是一个旨在解决这个问题的开放标准.

我正在使用节点模块'q',它实现了这个标准:https://github.com/kriskowal/q

简单的用例:

var Q = require('q');
Run Code Online (Sandbox Code Playgroud)

例如,我们有如下方法:

var foo = function(id) {
  var qdef = Q.defer();

  Model.find(id).success(function(result) {
    qdef.resolve(result);
  });

  return (qdef.promise);
}
Run Code Online (Sandbox Code Playgroud)

然后我们可以通过方法链接promises .then():

foo(<any-id>)
.then(function(result) {
  // another promise
})
.then(function() {
  // so on
});
Run Code Online (Sandbox Code Playgroud)

也可以通过以下值创建承诺:

Q([]).then(function(val) { val.push('foo') });
Run Code Online (Sandbox Code Playgroud)

还有更多,请参阅文档.

也可以看看:


mas*_*lum 5

可以做几件事来避免“俄罗斯套娃风格”。

  • 您可以将回调存储到变量:

    var on_read = function (foo, bar) {
          // some logic 
        },
    
        on_insert = function (err, data) {
          someAsyncRead(data, on_read);
        };
    
    someAsyncInsert('foo', on_insert);
    
    Run Code Online (Sandbox Code Playgroud)
  • 您可以使用一些有助于这些场景的模块

    // Example using funk
    var funk = require('funk');
    for(var i = 0; i < 10; i++) {
      asyncFunction(i, funk.add(function (data) {
        this[i] = data;
      }));
    }
    
    funk.parallel(function () {
      console.log(this);
    });
    
    Run Code Online (Sandbox Code Playgroud)