Duk*_*gal 27 javascript node.js
node.js代码以变成回调意大利面而闻名.
有哪些最好的技术可以克服这个问题,并在node.js中编写干净,不复杂,易于理解的回调代码?
看看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)
还有更多,请参阅文档.
也可以看看:
可以做几件事来避免“俄罗斯套娃风格”。
您可以将回调存储到变量:
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)| 归档时间: |
|
| 查看次数: |
13502 次 |
| 最近记录: |