Javascript 使用Promise值更新对象属性
我使用带有节点的Express与MySQL数据库交互。 my Card对象的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
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方法中执行异步操作,但未正确使用它。你必须做两件事中的一件:
在您的代码中,现在您正在路由器同步代码中运行,而您的创建操作是异步的…您正在创建方法中执行异步操作,但未正确使用它。你必须做两件事中的一件:
目前,在您的代码中,您正在路由器中运行同步代码,而您的创建操作是异步的…您的cards表是否有一个带有
自动增量
属性的密钥?您是否真的将承诺(card.create()的返回值)传递到res.json
?我想知道它怎么会有一个.id
。您的cards表是否有一个带有自动增量
属性的密钥?您是否真的将承诺(card.create()的返回值)传递到res.json
?我想知道它怎么会有一个.id
“用then从你的帖子路线解决它”毫无意义。“用then从你的帖子路线解决它”毫无意义。