最后,stackoverflow上报告了实际的堆栈溢出错误!RangeError:调用堆栈超出异步.eachSeries
我得到以下错误在下面的代码:
var m = pathA.substr(-(pathB.length)); // var
^
RangeError: Maximum call stack size exceeded
我相当肯定的答案就在这里报道,朝下方:
https://github.com/caolan/async/issues/75
不过,我不不明白如何解决我的代码。就我所知,我不是在异步函数内调用同步函数。任何人都可以澄清我需要做些什么来修复我的代码?
我在遍历结果集的交叉积来连接路径字符串,其中一个是另一个的子字符串。
var i = 0;
async.eachSeries(results.rows, function (r, next2a) {
var pathA = results.rows[i].id_path;
var j = 0;
async.eachSeries(results.rows, function (r2, next1a) {
var pathB = results.rows[j].id_path;
//check i=j
if (!(i == j)) {
var m = pathA.substr(-(pathB.length)); // var m = (pathA || '').substr(-((pathB) ? pathB.length : 0));
if ((m == pathB) && (pathA.length > pathB.length)) {
logger.log('DEBUG', (pathB + ' => ' + pathA));
conn.query("UPDATE user_token_details SET id_l1=$1, id_l2=$2, id_l3=$3, id_l4=$4,id_l5=$5,id_path2=$9, id_path=$6 WHERE token_uuid=$7 AND user_uuid=$8",
[results.rows[i].id_l1, results.rows[i].id_l2, results.rows[i].id_l3, results.rows[i].id_l4, results.rows[i].id_l5, results.rows[i].id_path,
results.rows[j].token_uuid, user_uuid, results.rows[j].id_path],
function (error, result) {
if (error) {
throw error;
}
j++;
next1a();
})
} else {
j++;
next1a();
}
} else {
j++;
next1a();
}
}, function() {
i++;
next2a();
});
}, function (err) {
});
下面是这个意大利面条的形式:
var A = [0, 1, 2, 3, 4...300];
async.eachSeries(A, function (a, next_a) {
async.eachSeries(A, function (b, next_b) {
// "Range Error: Maximum call stack size exceeded"
doSomethingAsync(a,b, function() {
next_a();
});
}, function (err) {
next_b();
})
}, function (err) {
// resume
})
哇,我认为自己非常好与异步,但没有办法在地狱,我会去尝试找出那个代码。尝试把它归结为一些更人性可分析的东西,或者我怀疑你会在这里得到0个答案 – mkoryak 2014-12-06 02:04:45
它与这个问题有关:https://github.com/rdegges/node-lupus http://www.rdegges.com/for-loops-in-node/ – metalaureate 2014-12-06 02:30:21
@mkoryak我添加了第二个示例 – metalaureate 2014-12-06 02:44:23