javascript - node中Promise也被嵌套了
問題描述
1.假如有兩個(gè)mongodb集合,一個(gè)是users,一個(gè)是posts,在posts列表中展示對(duì)應(yīng)的users信息,常規(guī)異步處理嵌套太多.就使用Promise來解決,發(fā)現(xiàn),promise解決時(shí)也有一個(gè)問題.
2. 解決代碼如下//封裝查詢一條函數(shù)findOneData = function(db, colName, data) { return new Promise(function(reslove, reject) {db.collection(colName).find(data).toArray(function(err, data) { if (err) {console.log('數(shù)據(jù)查詢錯(cuò)誤' + err);reject(err);return; } reslove({ db: db, data: data });}); });};db_conn() .then(function(db) {return findOneData(db, 'test', {}); }) .then(function(data) {console.log(data); });
這樣的方法是否正確?貌似是解決了,但是總感覺哪里不對(duì),,,
問題解答
回答1:promise不是最終解決方案也不見得比回調(diào)優(yōu)雅多少 async/await才是
回答2:有三點(diǎn),直接把上面的代碼寫在db_conn的then里面,然后返回this.在最外層統(tǒng)一使用catch捕捉異常。將console.log給刪了,看起來怪怪的,
回答3:db_conn().then(db=>{return { db:db, test:’test’, data:{} }}).then(findOneData).then(r=>{ console.log(r);});
最后把你的findOneData改一下接收參數(shù)的方式,是不是好點(diǎn)了?
回答4:db_conn() .then(db => findOneData(db, 'test', {})) .then(data => console.log(data));
這樣看起來是不是要順眼些?
(async function() { const db = await db_conn(); const data = await findOneData(db, 'test', {}); console.log(data);})();
這樣是不是更順眼些?
回答5:Promise 方案是在不增加語言元素的基礎(chǔ)上解決異步回調(diào)的問題,所以必然存在一些局限性。
在原有的回調(diào)之上,Promise 至少會(huì)增加一層回調(diào),所以在原回調(diào)鏈很短的情況下,比如題主的情況,只有一層,看起來用 Promise 似乎并無優(yōu)勢(shì),這也是正常的。
如果遇到更復(fù)雜的情況,更多層次的嵌套,就能看出用 Promise 的價(jià)值了。
樓上各位都提供了很好的寫法,我就不多說了。
相關(guān)文章:
1. 我的html頁面一提交,網(wǎng)頁便顯示出了我的php代碼,求問是什么原因?2. html5 - angularjs中外部模版加載無法使用3. css3 - 請(qǐng)問一下在移動(dòng)端CSS布局布局中通常需要用到哪些元素,屬性?4. tp6表單令牌5. javascript - vue-router怎么不能實(shí)現(xiàn)跳轉(zhuǎn)呢6. npm鏡像站全新上線7. 老哥們求助啊8. mySql排序,序號(hào)9. python - 模擬滑動(dòng)驗(yàn)證碼,有源碼,求解10. django - 后臺(tái)返回的json數(shù)據(jù)經(jīng)過Base64加密,獲取時(shí)用python如何解密~!
