Javascript 使用Promise值更新对象属性

Javascript 使用Promise值更新对象属性,javascript,object,asynchronous,promise,Javascript,Object,Asynchronous,Promise,我使用带有节点的Express与MySQL数据库交互。 my Card对象的create方法将数据保存到数据库中,并应将对象的id更新为查询返回的插入id class Card { constructor(d) { this.id = d.id || 0; this.playerId = d.playerId; this.drawn = false; this.title = d.title this.qty

我使用带有节点的Express与MySQL数据库交互。 my Card对象的
create
方法将数据保存到数据库中,并应将对象的id更新为查询返回的插入id

class Card {
    constructor(d) {
        this.id = d.id || 0;
        this.playerId = d.playerId;
        this.drawn = false;
        this.title = d.title
        this.qty = d.qty;
        this.hint = d.hint;
        this.type = d.type;
        this.descr = d.descr;
        this.pair = d.pair
        this.data = d;
    }

    create(conn) {
        return new Promise( (resolve, reject) => {
            var query = "INSERT INTO cards SET ? ";

            conn.query(query, this.data, function(err, result) {
                if (err) throw err;
                (typeof result.insertId === 'number')
                    ? resolve(result.insertId)
                    : reject("Failed to insert a new Card.");
                resolve(result.insertId);
            })

        }).then( (id) => {
            this.id = id;
            console.log("Your insert id is");
            console.log(this.id) // GREAT! It prints the correct id
            return this; // Set the value of the promise to this Card instance
        })
    }

} 
创建卡后,它应该打印卡的json表示

router.post('/create-card', function(req, res) {
    var data = req.body;
    var card = new Card(data);
    card = card.create(db.connection);
    res.json(card);
})
但是返回对象的
id
始终是默认值(0)

我尝试了几种不同的方法来捕获id,用新值设置对象的id属性,并将该值持久化到对象。然而,它似乎总是更新的卡的局部范围更广的版本,而不是原始卡(打印到页面上)


使用Promissions时,分配对象数据并返回该对象实例的正确位置是什么?

您调用
res.json
太早了。您需要等待承诺的决议:

card.create(db.connection).then( _ => res.json(card));

您调用
res.json
太快了。您需要等待承诺的决议:

card.create(db.connection).then( _ => res.json(card));

您正在create方法中执行异步操作,但未正确使用它。你必须做两件事中的一件:

  • 从create返回承诺,然后等待它在您的发布路线中使用“then”来实现
  • 使用wait并等待承诺得到解决

  • 在您的代码中,现在您正在路由器同步代码中运行,而您的创建操作是异步的…

    您正在创建方法中执行异步操作,但未正确使用它。你必须做两件事中的一件:

  • 从create返回承诺,然后等待它在您的发布路线中使用“then”来实现
  • 使用wait并等待承诺得到解决

  • 目前,在您的代码中,您正在路由器中运行同步代码,而您的创建操作是异步的…

    您的cards表是否有一个带有
    自动增量
    属性的密钥?您是否真的将承诺(card.create()的返回值)传递到
    res.json
    ?我想知道它怎么会有一个
    .id
    。您的cards表是否有一个带有
    自动增量
    属性的密钥?您是否真的将承诺(card.create()的返回值)传递到
    res.json
    ?我想知道它怎么会有一个
    .id
    “用then从你的帖子路线解决它”毫无意义。“用then从你的帖子路线解决它”毫无意义。