在两个嵌套循环完成迭代后,我在发送填充数组时遇到了困难。我正在使用Async npm库并尝试使用async.forEach完成回调来发送整个数组。内部数组迭代5个对象,构成一个“课程” - 之后课程对象被保存到人物对象,每个人对象有多个课程对象。
var self = this,
person = [],
course = [];
async.forEach(elements.value, function (element, callback1) {
self.elementIdElements(element.ELEMENT, 'td').then(function (rows) {
async.forEach(rows.value, function (cell, callback2) {
self.elementIdText(cell.ELEMENT).then(function (res) {
course.push(res.value);
callback2();
});
}, callback1);
person.push(course);
course = [];
});
}, function (err) {
res.send('grades: ' + JSON.stringify(person));
});
然而,它在遍历数组的过程中调用sendResponse,我根本无法幻想为什么会发生这种情况,它应该在遍历整个事件之后调用它。范围和异步调用令人困惑
提前致谢, 克里斯
我终于通过以下代码找出了回调的范围:
var self = this,
person = [],
course = [];
async.forEach(elements.value, function (element, callback1) {
self.elementIdElements(element.ELEMENT, 'td').then(function (rows) {
async.forEach(rows.value, function (cell, callback2) {
self.elementIdText(cell.ELEMENT).then(function (res) {
course.push(res.value);
callback2();
});
}, function (err) {
person.push(course);
course = [];
callback1();
});
});
}, function (err) {
res.send('grades: ' + JSON.stringify(person));
});
答案 0 :(得分:0)
您必须将回调嵌套在彼此之内。使用异步库,许多调用的最后一个参数是“最终回调”,它可以让您知道何时完成所有操作。
你是外async.forEach
看起来不错,sendResponse
的最终回调是最后的论据。
更改内部async.forEach
,因此callback
是最终参数。 async.forEach(rows.value, getCourseData, callback)
我可能还会建议更多描述性的回调名称,以便您可以轻松跟踪(“innerCallback
”“outerCallbacl
”或“rowsCallbacl
”......无论您想要什么)