数据没有推入数组nodejs

时间:2018-05-16 13:45:51

标签: javascript node.js asynchronous foreach push

我有一个函数,它使用url数组并使用npm包' read-titles'来获取这些url的标题。它成功地控制了.log的标题,但没有把它推入数组。数组打印为空。代码是

function getTitleArray(addresses) {
    var titles = [];
    if (addresses.length > 1) {
        addresses.forEach((urls) => {

            console.log(urls.search('http'));
            if (urls.search('http://') == -1) {
                urls = 'http://' + urls;
            }

            readTitle(urls).then((title) => {
                titles.push(title);
                console.log(title);
            }, (err) => {
                res.status(400).send(err);
            });

        });
    }
    console.log('Titles are: ' + titles);
    return titles;
}

2 个答案:

答案 0 :(得分:1)

正如@Mark_M所说,你有一个异步代码,所以你必须建立一个回调系统,以便在所有readTitle次调用结束后访问标题。

这是一种可以使用的递归方式:

function getTitleArray(addresses, callback) {

    var titles = [];
    if (addresses.length > 1) {

        let syncCallReadTile = function (it = 0, callback) {
            let url = addresses[it];
            if (url.indexOf('http://') == -1) {
                url = 'http://' + url;
            }
            readTitle(url).then((title) => {
                titles.push(title);
                it++;
                if (it == addresses.length) {
                    callback(null, titles);
                }
                else {
                    syncCallReadTile(it, callback);
                }
            }, callback);
        };

        syncCallReadTile(0, callback);

    }
}

getTitleArray([], (err, titles) => {
    if (err) {
        res.status(400).send(err);
    }
    else {
        console.log("Title :", titles);
    }   
})

答案 1 :(得分:0)

由于readTitle是异步的,因此返回空数组作为响应,这里使用Javascript回调修改了代码段。试试这个。

/itemlink/parent/{id}