我正在創建一個使用水線作爲ORM的Sails.js應用程序。有一個序列創建並實體Room
,並立即添加兩個User
實體add()
和save()
。除了save()不會像所有其他Model操作(例如Room.findOne()...then(()=>{})
)那樣返回承諾,因爲原始函數期望承諾作爲回報,我需要手動創建承諾以使其工作。在水線保存()實體上是異步的,但不返回承諾
手動做出承諾的最佳計劃?還有其他建議嗎?
我正在創建一個使用水線作爲ORM的Sails.js應用程序。有一個序列創建並實體Room
,並立即添加兩個User
實體add()
和save()
。除了save()不會像所有其他Model操作(例如Room.findOne()...then(()=>{})
)那樣返回承諾,因爲原始函數期望承諾作爲回報,我需要手動創建承諾以使其工作。在水線保存()實體上是異步的,但不返回承諾
手動做出承諾的最佳計劃?還有其他建議嗎?
的documentation並沒有說明什麼findOne()
返回一個承諾,但你可以在一個承諾包.save()
幾乎你會與任何其他基於回調的函數一樣:
function saveWithPromise(entity) {
return new Promise(function (resolve, reject) {
entity.save(function (error) {
if (error) { reject(error); } else { resolve(); }
});
});
}
要使用它:
saveWithPromise(myEntity)
.then(function() { console.log('all done!'); });
這是一個很棒的迴應。如果我發現問題出現多次,我肯定會使用這樣的東西。 – ktamlyn
這是我最初的解決方案,但也許我需要提交一個功能請求來添加藍鳥支持save()。
room.participants.add(users);
let roomPromise = new Promise((resolve, reject)=>{
room.save((err) => {
if(err) {
reject(err);
}
resolve(room);
});
});
return roomPromise;
你如何「手動創造承諾」?請告訴我們該代碼,以便我們可以提出改進建議。 – Bergi
您是否考慮過向圖書館提交關於不一致返回值的錯誤報告? – Bergi
在類似的行上,'query()'也不返回promise。 [此方法不支持.exec()或.then(),並且不返回承諾。](https://sailsjs.com/documentation/reference/waterline-orm/models/query) – Sangharsh