javascript - node異步問題
問題描述
想要callback在findById之后執(zhí)行,但又不能放在它的回調(diào)中,不然會執(zhí)行多次。應(yīng)該怎么辦?
問題解答
回答1:軟件是服務(wù)行業(yè),要有服務(wù)意識……代碼貼圖沒問題,可以看得很清晰,但是如果回答者想改你的代碼,還得重新敲一遍…………
我看你已經(jīng)用了 es6 的語法,所以正解肯定是 Promise,可以自己封裝成 Promies
exports.findList = function(findObj, callback) { Info.find(findObj, function(err, info) {const promises = info.map(f => new Promise((resolve, reject) => { f.image = f.images.split(',')[0]; User.findById(f.author_id, function(error, user) {if (error) { reject(error); return;}f.author_name = user.name;f.authro_avatar = user.avatar;resolve(f); });}));Promise.all(promises) .then(function(values) {// 成功的時候,這個 values 是所有 info 對象,// 作為一個數(shù)組返回出來,而不是某一個callback(null, values); }) .catch(function(error) {// 注意這里 error 是第一個失敗 error// 不是所有的 error callback(error); }); });};
當(dāng)然也可以用 Bluebird 提供的工具函數(shù)來封裝 Promise
需要注意的是你這里運(yùn)行了好多個異步調(diào)用,所以要一起返回的話,肯定也是好多個結(jié)果。所以注意 Promise.all 后面 then() 中的回調(diào)。
如果你要用 es5,建議你寫成 es6 再 Babel。不過 Node 7.6+ 已經(jīng)支持 es2017 的一些特性,所以其實不必在意這個問題。如果確實需要,就采用在 findById 回調(diào)中記數(shù)的辦法,記滿放大招(調(diào)用 callback)。
回答2:方案一
使用 async/await。這樣就可以按照同步方式使用 User.findById。
方案二
在循環(huán)中把 User.findById 加入一個數(shù)組,然后用 Promise.all,callback 寫在 Promise.all().then() 中。
方案三
使用一個狀態(tài)變量,每次檢查一下,滿足條件再執(zhí)行 callback。丑陋的方法,不要用。
回答3:設(shè)置個參數(shù),執(zhí)行完設(shè)置下,以后每次進(jìn)入回調(diào)判斷下 ..
回答4:對于callback地獄,請使用Promise 或者類似類庫。
回答5:exports.findList=function (findObj,callback) { Info.find(findObj,function (err,info) {for(let i in info){ info[i].image=info[i].images.split(’,’)[0]; User.findById(info[i].author_id,function (error,user) {info[i].author_name=user.name;info[i].author_avatar=user.avatar;if(i==info.length-1){ callback(err,info);} })} })}
我的解決方法,有點low。。?
回答6:二樓說得對,用promise解決。
相關(guān)文章:
1. mysql - 怎么生成這個sql表?2. javascript - JS如何取對稱范圍的隨機(jī)數(shù)?3. 數(shù)據(jù)庫 - mysql如何處理數(shù)據(jù)變化中的事務(wù)?4. java - ehcache緩存用的是虛擬機(jī)內(nèi)存么?5. 關(guān)于docker下的nginx壓力測試6. dockerfile - 我用docker build的時候出現(xiàn)下邊問題 麻煩幫我看一下7. docker-machine添加一個已有的docker主機(jī)問題8. dockerfile - [docker build image失敗- npm install]9. java - 線上應(yīng)用,如果數(shù)據(jù)庫操作失敗的話應(yīng)該如何處理?10. 使用PHP和MySQL的UNIQUE如何像京東注冊那樣保證用戶名唯一?
