【发布时间】:2021-05-28 22:48:36
【问题描述】:
希望你今天过得愉快。我最近发现在for 循环中处理回调并不容易。我尝试了几件事,但找不到解决方案。
代码如下:
var book = new Array;
var chapters = Object.keys(epub.spine.contents).length;
for (let i = 0; i < chapters; i++) {
let cacheArray = [];
epub.getChapter(epub.spine.contents[i].id, function (err, data) {
if (err) {
return console.log(err);
}
//remove html tags
let str = data.replace(/<\/?[\w\s]*>|<.+[\W]>/g, '');
book.push(str)
})
}
console.log(book)//returns empty array ofc
这段代码执行后,我需要遍历数组来搜索它的内容。如果不是这样,我的方法是将其发送到数据库。
我的方法如下:
var recursiveChapter = function (n) {
var book = new Array;
if (n < chapters) {
// chapter function
epub.getChapter(epub.spine.contents[n].id, function (err, data) {
if (err) {
throw err
}
//remove HTML tags
let str = data.replace(/<\/?[\w\s]*>|<.+[\W]>/g, '');
book.push(str)
recursiveChapter(n + 1)
});
}
}
//start the recursive function
recursiveChapter(0)
console.log(book)//returns an empty array
我被困住了,想不出一种在不将其存储在数据库中的情况下使用这些数据的方法。 任何帮助将不胜感激。
【问题讨论】:
-
你能告诉我们你期望这段代码做什么以及你目前面临什么?
-
为什么不承诺您的
getChapter功能。等待这个方法会更容易 -
@AliHussam getChapter 来自外部库,所以是的,我可以修改它,但我认为这需要一些时间。 (github.com/julien-c/epub) 这个库顺便说一句。
-
@arminyahya 这个函数基本上将一个 epub 解析为一个字符串,一旦它完成了,我就可以通过事件发射器与之交互。一旦我在那里,我需要加载每一章并删除 html 标签,将每一章推入一个数组,然后我想用 forEach 循环进行搜索。我遇到的问题是 getChapter 返回一个回调,所以 for 循环继续运行,如果我尝试使用数组,它总是空的,所以我不能继续我刚才提到的过程。
-
你的函数有一个错误的第一个回调,你可以简单地做
util.promisify来承诺它或为此调用编写一个承诺的包装器。
标签: javascript node.js arrays for-loop callback