gpt4 book ai didi

javascript - Node : invoking callback function inside a for loop

转载 作者:搜寻专家 更新时间:2023-10-31 22:43:41 25 4
gpt4 key购买 nike

基本上,我正在尝试调用一个函数,其中一个循环正在运行,其中存在许多回调函数(回调 hell )。如下所示:

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*/
});
});
}

我在我的应用程序的几个位置有相同的模式,有时我遇到回调问题,for 循环结束,但回调不给出响应,似乎 DAO 方法已被调用但仍在等待回复。有没有优化的方法来克服这个问题?

很高兴知道是否有一些 javascript 编码模式可以解决这个问题。(除了任何第 3 方库)谢谢

最佳答案

您听说过 Deferred 或 Promises 吗?我想这就是你要找的。在它的基本形式中,它基本上是一个具有两个处理程序的对象。一个用于失败,一个用于成功。

但还有其他辅助函数,如 thenwhen 可以让您以更易读的方式链接函数。看看 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);
});
}

这样做的好处是双重的:

  1. 您可以免费获得错误处理程序代码和结果处理程序代码的分离
  2. 它可以防止你嵌套 hell 。 (回调,在回调中,在回调中...)由于延迟,您可以分解出实际的逻辑。
  3. 回调同步变得非常容易,因为您只需要使用 when .

我使用 jQuerys Deferreds 因为 jsFiddle 在下拉框中有 jquery。您可以使用任何您想要的实现。

当你有了自己实现它的概念时,应该不会太难。

关于javascript - Node : invoking callback function inside a for loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20116416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com