鍍金池/ 問答/HTML/ javascript promise內(nèi)部賦值修改外部引用類型值時不生效

javascript promise內(nèi)部賦值修改外部引用類型值時不生效

問題描述:在使用promise對象獲取數(shù)據(jù)庫(mongodb里面的數(shù)據(jù))數(shù)據(jù)后,無法修改異步函數(shù)loadData(返回promise對象)外部定義的對象或數(shù)組:
求大佬解惑:具體代碼如下

    let timeLine=req.body.timeLine;// ['2018-1', '2018-2', '2018-3', '2018-4', '2018-5', '2018-6', '2018-7', '2018-8', '2018-9', '2018-10', '2018-11', '2018-12']
        
    let loadDepartment=['南京南','南京所','合肥南','徐州東'];
    let result=[];
    loadDepartment.forEach((department,index,arr)=>{
   
    async function loadData(condition) {
        let client=await getMGClient(url);
        let db=client.db(dbName);
        let coll=db.collection('JLarrange');
        let dataInDB=await coll.find(condition).toArray();
        return dataInDB[0];
    }
    let tempdata=[];
   for(let index in timeLine){
       console.log(index)
       let condition={department,tableName:timeLine[index]}
       loadData(condition).then(dataInDB=>{
            let monthTime=0;
            if(!!dataInDB){
                //數(shù)據(jù)存在
                for(let dataindex in dataInDB.data){
                    monthTime+=dataInDB.data[dataindex].workTime;
                }
            }
           tempdata.push(monthTime)
           console.log(tempdata)//這里輸出的tempdata有值
       })
   }
   console.log(tempdata)
   **//這里輸出的tempdata全部為[]**
   result.push({department:department,data:tempdata}); 
})
console.log(result);
回答
編輯回答
幼梔

異步函數(shù)都沒有開始處理,打出來的值當(dāng)然是空了;需要執(zhí)行完后才有結(jié)果

let timeLine = req.body.timeLine; // ['2018-1', '2018-2', '2018-3', '2018-4', '2018-5', '2018-6', '2018-7', '2018-8', '2018-9', '2018-10', '2018-11', '2018-12']

let loadDepartment = ['南京南', '南京所', '合肥南', '徐州東'];
let result = [];
let promises = loadDepartment.map((department, index, arr) => {

    async function loadData(condition) {
        let client = await getMGClient(url);
        let db = client.db(dbName);
        let coll = db.collection('JLarrange');
        let dataInDB = await coll.find(condition).toArray();
        return dataInDB[0];
    }
    let tempdata = [];
    let promises1 = []
    for (let index in timeLine) {
        console.log(index)
        let condition = {
            department,
            tableName: timeLine[index]
        }
        promises1.push(loadData(condition).then(dataInDB => {
            let monthTime = 0;
            if (!!dataInDB) {
                //數(shù)據(jù)存在
                for (let dataindex in dataInDB.data) {
                    monthTime += dataInDB.data[dataindex].workTime;
                }
            }
            tempdata.push(monthTime)
            console.log(tempdata) //這里輸出的tempdata有值
        }))

    }
    console.log(tempdata) //這里輸出的tempdata全部為[]**
    return Promise.all(promises1).then(() => {
        result.push({
            department: department,
            data: tempdata
        });
    })
})
Promise.all(promises).then(() => {
    console.log(result);
})
2018年3月5日 05:55