agp*_*gpt 5 javascript callback node.js
基本上,我试图调用一个函数,其中一个循环正在运行,其中存在许多回调函数(回调地狱)..如下所示:
for(var i=0;i<data.id.length;i++)
{
DAO.getUserById(data.id[i],function(err,resp1)
{
/* some other work based on resp1 */
DAO.getOtherData(resp1.username,resp1.userId,function(err,resp2)
{
/* similary some other work*/
});
});
}
Run Code Online (Sandbox Code Playgroud)
我在我的应用程序的几个位置有相同的模式,有时我遇到回调问题,for循环结束,但回调没有给出响应,似乎DAO方法已被调用但仍在等待响应.有没有优化的方法来克服这个问题?
很高兴知道是否有一些javascript编码模式可以解决这个问题.(除了任何第三方库)谢谢
您听说过 Deferreds 或 Promise 吗?我想这就是你要找的。在它的基本形式中,它基本上是一个具有两个处理程序的对象。一种是失败,一种是成功。
但是还有其他辅助函数,例如then或when,它们可以让您以更具可读性的方式链接函数。查看 q 或jQuery实现。要获得非常好的介绍,请阅读 Async JavaScript 一书。
编辑:/
我为你做了一个 js fiddle 的工作示例。
var data = { id : [] };
for(var i = 0; i < 10; i++) {
data.id.push(i);
}
// DAO definition
var DAO = {
getUserById : function(id) {
var deferred = $.Deferred();
setTimeout(function() {
var isError = Math.floor(Math.random()*11) > 5;
if(isError) {
deferred.reject("WOW - Much Handler - So error");
} else {
deferred.resolve({
username : 'Max',
userId : id
});
}
}, 50);
return deferred.promise();
},
getOtherData : function(username, userId) {
var deferred = $.Deferred();
setTimeout(function() {
deferred.resolve((username + ' id: ' + userId));
}, 20);
return deferred.promise();
}
};
function printResult(res) {
$('#result').html($('#result').html() + '<br />' + res);
};
// DAO usage
for(var i=0;i<data.id.length;i++)
{
DAO.getUserById(data.id[i])
.done(function(res) {
DAO.getOtherData(res.username, res.userId).done(function(result) {
printResult(result);
});
})
.fail(function(res) {
printResult(res);
});
}
Run Code Online (Sandbox Code Playgroud)
这样做的巨大优势是双重的:
我使用了 jQuerys Deferreds,因为 jsFiddle 在下拉框中有 jquery。您可以使用任何您想要的实现。
当你有了这个概念后,自己实施它应该不会太难。
| 归档时间: |
|
| 查看次数: |
1545 次 |
| 最近记录: |