【发布时间】:2014-12-18 09:18:50
【问题描述】:
我希望在递归函数完全完成后执行回调,该函数可以持续不确定的时间。我正在努力解决异步问题,并希望在这里得到一些帮助。使用request模块的代码如下:
var start = function(callback) {
request.get({
url: 'aaa.com'
}, function (error, response, body) {
var startingPlace = JSON.parse(body).id;
recurse(startingPlace, callback);
});
};
var recurse = function(startingPlace, callback) {
request.get({
url: 'bbb'
}, function(error, response, body) {
// store body somewhere outside these funtions
// make second request
request.get({
url: 'ccc'
}, function(error, response, body) {
var anArray = JSON.parse(body).stuff;
if (anArray) {
anArray.forEach(function(thing) {
request.get({
url: 'ddd'
}, function(error, response, body) {
var nextPlace = JSON.parse(body).place;
recurse(nextPlace);
});
})
}
});
});
callback();
};
start(function() {
// calls final function to print out results from storage that gets updated each recursive call
finalFunction();
});
似乎一旦我的代码通过嵌套请求中的for 循环,它就会继续超出请求并结束初始函数调用,而递归调用仍在继续。我希望它在所有嵌套的递归调用都完成之前不会完成最高级别的迭代(我无法知道有多少)。
非常感谢任何帮助!
【问题讨论】:
-
你需要给东西命名,你需要一个围绕所示部分的外部包装函数,你可以收集结果/监控进度。
-
你需要解决很多问题。 (1)将
recurse(nextPlace);更改为recurse(nextPlace, callback);(2)如果它不是您的测试中的数组,则递归停止,因此,在if(anArray) {....}之后写下callback();(3)完全删除callback();您在最底部 (4) 在 cmets 部分中,如果您让任何异步发生或执行停止,您应该适当地传递或调用(这次使用return callback();)回调函数。你已经准备好了。无论如何,请执行 (1) - (3),您会告诉我们发生了什么。 -
我只需要在所有递归循环完成后调用最终函数。这将在每个循环完成后调用它。我的第二个问题,也是更大的问题,是如何使 HTTP 请求阻塞——现在,一旦它们被调用,循环就会继续,而不是等待它们完成。这确实是造成问题的原因。
-
你是对的,我错了。然后,当您遍历数组时,您应该使用异步,例如
async.parallel。例如,请参见此处:stackoverflow.com/q/26431257/1355058 我还想将不同的参数传递给所有并行发生的调用。现在,你准备好了。 :) -
我会更详细地查看异步模块。是否有一个特定的函数可以很好地用于递归?我需要最高级别的
for循环才能最后完成,所以当我运行回调时(我可以将条件传递给它以测试它是否等于startingPlace),我来对了吗?跨度>
标签: javascript node.js asynchronous recursion