2017-02-18 59 views
0

我正在創建一個使用水線作爲ORM的Sails.js應用程序。有一個序列創建並實體Room,並立即添加兩個User實體add()save()。除了save()不會像所有其他Model操作(例如Room.findOne()...then(()=>{}))那樣返回承諾,因爲原始函數期望承諾作爲回報,我需要手動創建承諾以使其工作。在水線保存()實體上是異步的,但不返回承諾

手動做出承諾的最佳計劃?還有其他建議嗎?

+1

你如何「手動創造承諾」?請告訴我們該代碼,以便我們可以提出改進建議。 – Bergi

+1

您是否考慮過向圖書館提交關於不一致返回值的錯誤報告? – Bergi

+0

在類似的行上,'query()'也不返回promise。 [此方法不支持.exec()或.then(),並且不返回承諾。](https://sailsjs.com/documentation/reference/waterline-orm/models/query) – Sangharsh

回答

3

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!'); }); 
+0

這是一個很棒的迴應。如果我發現問題出現多次,我肯定會使用這樣的東西。 – ktamlyn

0

這是我最初的解決方案,但也許我需要提交一個功能請求來添加藍鳥支持save()。

room.participants.add(users); 
let roomPromise = new Promise((resolve, reject)=>{ 

     room.save((err) => { 
     if(err) { 
      reject(err); 
     } 
     resolve(room); 
     }); 

    }); 
return roomPromise;