【问题标题】:for loop with promises is not working properly in nodejs带有承诺的 for 循环在 nodejs 中无法正常工作
【发布时间】:2014-06-17 16:00:01
【问题描述】:

我是 nodejs 的新手,我正在尝试在 for 循环中使用 Promise,在该循环中我首先获取 postgres 序列的下一个值,然后将其值重置为

for(var i=0;i<3;i++){
    getNextVal().then( function(result) {
        var nextVal = result.nextval;
        console.log("next value :"+nextVal);
        setSeqVal(nextVal).then( function(result) {
           console.log("reset value :"+result.curValOfSeq);
        });
    });
}

function getNextVal(){
    var promise = new Promise (function(resolve, reject) {
        pg.connect(conString, function(err, client, done){
            if(err) {
                console.log ('error fetching client from pool ' + err);
                reject (err);
            }
            client.query("select nextval('test_seq')", function(err, result) {
                done();
                    if(err) {
                        console.log('error running query', err);
                        reject (err);
                    }
                    if (result.rows) {
                        resolve({'nextval' : result.rows[0].nextval});
                    }
                    else {
                        console.log('Could not get next value');
                    }
            });
        });
    });
    return promise;
};

function setSeqVal (curVal){
    var promise = new Promise (function(resolve, reject) {
        pg.connect(conString, function(err, client, done){
            if(err) {
                console.log ('error fetching client from pool ' + err);
                reject (err);
            }
            client.query("ALTER SEQUENCE test_seq RESTART WITH "+curVal, function(err, result) {
                done();
                if(err) {
                    console.log('error running query', err);
                    reject (err);
                }
                resolve({'curValOfSeq' : curVal});
            });
        });
    });
    return promise; 
};

输出如下:

next value :1
next value :2
next value :3
reset value :1
reset value :2
reset value :3

我想要的输出如下:

next value :1
reset value :1
next value :2
reset value :2
next value :3
reset value :3 

请帮助我解决这个问题。

【问题讨论】:

标签: javascript node.js postgresql


【解决方案1】:

您似乎想要顺序工作而不是并行工作。

你可以试试这样的:

var LIMIT = 3;
var doTheNext = function(index) {
    if(index < LIMIT) {
        getNextVal().then( function(result) {
                var nextVal = result.nextval;
                console.log("next value :"+nextVal);
                setSeqVal(nextVal).then( function(result) {
                   console.log("reset value :"+result.curValOfSeq);
                   doTheNext(++index);
                });
            });
    }
};

doTheNext(0);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 2020-10-27
    相关资源
    最近更新 更多