在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/數(shù)據(jù)庫(kù)  HTML/ node中map函數(shù)同步執(zhí)行

node中map函數(shù)同步執(zhí)行

看到這樣一句話 node中map()有一個(gè)特性:當(dāng)其函數(shù)里面里面有回調(diào)它就變成異步;
我現(xiàn)在有一個(gè)這樣的一個(gè)函數(shù),遍歷數(shù)組從mongodb中找出想要的數(shù)據(jù)。

function save(arr) {
        let newArr = [];
        arr.map((item) => {
            Model.findOne({_id: item.id}, (err, data) => {
                newArr.push(data)
                //   do something
            })
        });
        console.log(newArr)
    }

我不是知道如何將這個(gè)函數(shù)改為同步的,我想要得到一個(gè)有數(shù)據(jù)的newArr,而不是一個(gè)空數(shù)組,
請(qǐng)指教!

回答
編輯回答
蝶戀花

async await 寫(xiě)一個(gè)函數(shù)new promise你查詢到的值,然后用async定義save函數(shù),用await來(lái)獲取你resolve的值,在通過(guò)push生成數(shù)組。

2017年2月18日 18:37
編輯回答
雨萌萌

一日吸貓,終身吸貓。一旦異步,就不要試圖在其中混入同步的邏輯,這會(huì)極大地?fù)p失性能和造成各種問(wèn)題。相反,你應(yīng)該把所有同步的邏輯想辦法改為異步的,這是使用異步編程的最基本要求,也是對(duì)同步編程思維方式最大的一個(gè)挑戰(zhàn)。
異步的思維方式要求你找到合適的時(shí)間點(diǎn)觸發(fā)合適的事件。比如你的場(chǎng)景可以這樣理解:

  1. arr中的每個(gè)元素都可以找到一個(gè)對(duì)應(yīng)的數(shù)據(jù)庫(kù)文檔
  2. 同時(shí)對(duì)數(shù)據(jù)庫(kù)發(fā)起n個(gè)請(qǐng)求,每個(gè)請(qǐng)求根據(jù)_id查詢對(duì)應(yīng)的記錄(這就是map里面做的事情)
  3. 這些查詢得到結(jié)果是有先后的,但是誰(shuí)先誰(shuí)后不知道
  4. 你需要的時(shí)間節(jié)點(diǎn)是:當(dāng)所有查詢都返回結(jié)果并pushnewArr之后再執(zhí)行后續(xù)操作

4的要求可以抽象為:同時(shí)執(zhí)行n個(gè)操作,如何在n個(gè)操作都完成后再執(zhí)行下面的操作。這是異步編程里面經(jīng)常遇到的問(wèn)題。因?yàn)榻?jīng)常遇到,所以肯定也已經(jīng)有解決方案了:

  1. Bluebird
  2. async

這兩個(gè)類(lèi)庫(kù)請(qǐng)?zhí)粢粋€(gè)仔細(xì)學(xué)習(xí),都可以解決你的問(wèn)題。因?yàn)檫@是使用異步編程必須跨過(guò)的一關(guān),必須要你自己理解,我在這里不給具體的答案,請(qǐng)先嘗試自己解決。

就事論事來(lái)說(shuō)你的問(wèn)題,無(wú)論是從效率還是便捷性上來(lái)說(shuō),其實(shí)你都做得太復(fù)雜了(當(dāng)然不排除你是為了實(shí)驗(yàn)?zāi)康模?。從解決問(wèn)題的角度來(lái)說(shuō),建議直接使用$in

function save(arr, callback) {
    let newArr = [];
    let ids = arr.map((item) => {
        return item.id
    });
    Model.find({_id: {$in: ids}}, (err, data) => {
        if (err) throw err;
        // data就是你需要的結(jié)果
        console.log(JSON.stringify(data));
        callback(err, data);
    })
}
2018年2月12日 22:32
編輯回答
萌小萌

你這個(gè)問(wèn)題跟map沒(méi)關(guān)系
這樣試一下
mongoose 4 操作結(jié)果好像是promise

var save= async function (arr) {
    let newArr = [];
    for(var i=0;i<arr.length;i++){//await 不能嵌套在函數(shù)內(nèi)所以只能用for循環(huán)
        await Model.findOne({_id: arr[i].id}, (err, data) => {
            newArr.push(data)
        })
    }
    console.log(newArr)
};
2017年9月27日 08:32
編輯回答
萢萢糖

首先,你這樣用map和用forEach沒(méi)什么區(qū)別。

其次,對(duì)于異步并行操作,用promise.all,不要用單純的循環(huán)。

2018年5月25日 23:33