2017-08-31 10 views
2

使用mysql2/promise庫時,我的一個對象部分包含來自先前SELECT語句的未解決的承諾。在MySQL之前解析承諾對象INSERT

插入時,我得到一個不正確的整數值錯誤消息,因爲承諾尚未解決。什麼是解決包含的承諾的優雅方式?

let insertObj = { 
    author: this.authorId // unresolved promise #1 
    recipient: this.recipientId // unresolved promise #2 
    // ... more promises here 
    message: this.messageBody 
} 

let conn = this.pool.getConnection(); 
return conn.then((conn) => { 
    const res = conn.query("INSERT INTO posts SET ?", [insertObj]); 
    conn.release(); 
    return res 
}); 

回答

2

使用async/await

async function f() { 
    // Prefix all promises with await 
    let insertObj = { 
     author: await this.authorId, 
     recipient: await this.recipientId, 
     // ... more promises here 
     message: await this.messageBody 
    } 

    let conn = this.pool.getConnection(); 
    return conn.then((conn) => { 
     const res = conn.query("INSERT INTO posts SET ?", [insertObj]); 
     conn.release(); 
     return res; 
    }); 
} 

沒有async/await你可以這樣做:

let insertObj = { 
    author: this.authorId, 
    recipient: this.recipientId, 
    // ... more promises here 
    message: this.messageBody 
}; 
// Replace promises by their promised values as soon as they resolve: 
Object.entries(insertObj).forEach(([key, value]) => { 
    if (typeof Object(value).then === 'function') // it is a "thenable" 
     value.then (response => insertObj[key] = response); 
}); 
// Wait for all of them to resolve 
Promise.all(Object.values(insertObj)).then(_ => { 
    let conn = this.pool.getConnection(); 
    return conn.then((conn) => { 
     const res = conn.query("INSERT INTO posts SET ?", [insertObj]); 
     conn.release(); 
     return res; 
    }); 
}); 
+0

短期和優雅。出於好奇,我會如何去使用定期承諾? – ddillert

+0

你對常規承諾有什麼意義? 'this.authorId'不是一個普通的承諾?或者你的意思是:「我怎樣才能做到這一點,而不是'async/await',而用'then'?」 – trincot

+0

是的,「我怎樣才能做到這一點,而不是異步/等待,但隨着時間」。我試圖瞭解async/await在底層做了些什麼。 – ddillert