节点JS:我的情况的代码没有按预期工作

时间:2015-09-28 08:52:20

标签: node.js

我想查询sql以获取名称并将其存储在数组中。 下次如果它出现在数组中,那么它不应该查询SQL。

但是这里每次都要查询sql。 我怎么能避免这个?

context.xml

2 个答案:

答案 0 :(得分:-2)

Nodejs是异步的,你需要使用回调,但你在同步循环中运行异步代码。

查看 async 模块:https://github.com/caolan/async。存在异步循环,例如forEach或eachSerie。

答案 1 :(得分:-2)

Node JS查询函数是异步的,因此首先从数组中删除重复项,然后开始查询。

以下代码将删除数组 ids 中的重复项。

ids.filter(function(elem, index) {
    return ids.indexOf(elem) == index;
});

<强>编辑:

否则同步查询。但它在节点js中不是一个好习惯。

var ids = [62519, 1, 2, 3, 2656, 82969, 36201, 82969, 78788, 82969, 97647, 82969, 53745, 54510, 60850, 82969, 29872, 51407, 29347, 105113];

var cnames = {};

getAllNames(ids.length);

function getAllNames(lastIndex) {
    var nlid = ids[lastIndex];
    console.log(nlid);

    if(lastIndex <= 0) // fully iterated
        return;

    if (cnames[nlid] !== undefined) {
        console.log('already present');
    } else {
        console.log('not present');
            sqlcon.query('select name from ss_newsletters where newsletterid=' + nlid + ' limit 1', function(err, rows, fields) {
                if (err) {
                    console.error(err);
                } else {
                    var x = rows[0].name;
                    cnames[nlid] = x;
                }
                getAllNames(lastIndex - 1); // Call Synchronously
            });
    }
}