代码之家  ›  专栏  ›  技术社区  ›  sigil

为什么我的承诺在某些情况下返回数据库行,而在其他情况下不返回?

  •  0
  • sigil  · 技术社区  · 8 年前

    我在模块中有一个函数 db 使用节点postgres将新行插入数据库的:

    module.exports={addUser: function(phonenumber){
            return new Promise(function(resolve,reject){
                queryStr='insert into users (phonenumber,status,exitStatus) values (\''+phonenumber+'\') returning *';
                pool.query(queryStr,(err,res)=>{
                    if (err){
                        reject(err);
                    }
                    else{
                        resolve(res);
                    }
                });
            });
    
        }
    }
    

    当我这样称呼它时:

    var number=123456789;
    testAddUser(number);
    
    function testAddUser(phonenumber){
        db.addUser(phonenumber).then(val=>{console.log(val.rows[0])});
    }
    

    然后,它成功地将返回的行输出到控制台日志:

    anonymous {
      id: 25,
      phonenumber: '123456789'}
    

    这就是我想要的。

    但当我这样调用它时,从另一个Promise-returning函数 then :

    db.someOther_promise(num).then(value=>{
                doSomeStuff();
                return db.addUser(num);
        }).then(value=>{
            console.log("value "+value.rows[0]);
        })
    

    然后我只得到输出:

    value [object Object] 
    

    这让我想也许 someOther_promise() 正在完成并启动 .then() db.addUser(num) 呼叫完成。但我认为回报承诺意味着 .然后() 必须等待由第一个 .然后() 完成。

    1 回复  |  直到 8 年前
        1
  •  3
  •   ewcz    8 年前

    在我看来,这与承诺无关。当你这样做的时候

    console.log("value "+value.rows[0]);
    

    您正在转换 value.rows[0] 到字符串,然后输出 value [object Object] . 如果您使用 console.log("value ", value.rows[0]) 相反,您应该看到所需的输出。。。

    推荐文章