for循环内部的回调函数-Node.js

卢卡·德·阿查

希望您过得愉快。我最近发现,在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

我被困住了,无法想到一种不将其存储在数据库中就使用该数据的方法。任何帮助,将不胜感激 。

特里·伦诺克斯(Terry Lennox)

有几种方法可以解决此问题。一种方法是使用异步库,这允许运行异步。并行或串行调用。

例如,我们可以使用async.mapSeries()获得一系列异步调用的结果作为数组。

输入ID数组,然后回调将返回返回的数据数组,例如,我模拟了getChapter()函数,以了解其工作方式:

// Mock out epub object
const epub = { 
    getChapter(id, callback) {
        setTimeout(() => callback(null, "Data for id " + id), 250);
    }
}

let ids = [1,2,3,4];
console.log("Calling async.mapSeries for ids:", ids);
async.mapSeries(ids, epub.getChapter, (err, result) => {
    if (err) {
        console.error(err);
    } else {
        console.log("Result:", result)
    }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/async/3.2.0/async.min.js" integrity="sha512-6K6+H87tLdCWvY5ml9ZQXLRlPlDEt8uXmtELhuJRgFyEDv6JvndWHg3jadJuBVGPEhhA2AAt+ROMC2V7EvTIWw==" crossorigin="anonymous"></script>

您还可以使epub调用变大,并使用Promise.all来获得结果,如下所示:

epub = { 
    getChapter(id, callback) {
        setTimeout(() => callback(null, "Data for id " + id), 250);
    }
}
 
let ids = [1,2,3,4];

function getChapterPromisified(id) {
    return new Promise((resolve, reject) => { 
        epub.getChapter(id, (err, data) => { 
            if (err) {
                reject(err);
            } else {
                resolve(data);
            }
        })
    })
}

// Create a list of promises, one for each call
const promises = ids.map(id => getChapterPromisified(id))
Promise.all(promises)
    .then(result => console.log("Result:", result))
    .catch(error => console.error("An error occurred:", err));

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章