suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Promise Mungo-Schleife durch Abfrage – Stapelüberlauf

let result = []; //存放查询结果
model.WithdrawModel.find({status:'processing'}, (err, doc) => {
            if (err) {
                console.log(err);
                res.json({ code: -1, msg: '查询失败'});
                return;
            } else {
                doc.map((item) => {
                    model.UserModel.findOne({phone:item.phone},'name IDcard bank bankCard bank_area bank_name', (err, bankInfo) => {
                        if (err) {
                            console.log(err);
                        } else {
                            let obj = {};
                            Object.assign(obj, JSON.parse(JSON.stringify(item)), JSON.parse(JSON.stringify(bankInfo)));
                            result.push(obj);
                            console.log(result); 
                        }
                    })
                });
                res.json({ code: 0, msg: '查询成功', result: result});
                return;
            }
 });

Beim Durchlaufen der Abfrage gibt das obige Ergebnis direkt einen Nullwert zurück. Wie kann ich sicherstellen, dass alle internen Abfragen in doc.map abgeschlossen sind, bevor der Ergebniswert herausgenommen wird?

天蓬老师天蓬老师2825 Tage vor1157

Antworte allen(2)Ich werde antworten

  • 仅有的幸福

    仅有的幸福2017-06-29 10:11:23

    自问自答吧,也是受人指点。

    promise.all 实现如下:

            let result = []; //存放查询结果
            let doc1 = []; //存放第一次查询的结果
            model.WithdrawModel.find({status:'processing'}).exec().then((doc) => {
                doc1 = doc;
                const promises = doc.map(item => model.UserModel.findOne({phone:item.phone},'name IDcard bank bankCard bank_area bank_name'));
                return Promise.all(promises);
            })
            .then((bankInfoList) => {//promise.all返回的结果是一一对应的
                for(let i=0; i<doc1.length; i++){
                    let obj = {};
                    
                    Object.assign(obj, JSON.parse(JSON.stringify(doc1[i])), JSON.parse(JSON.stringify(bankInfoList[i])));
                    result.push(obj);
                }
                return new Promise((resolve, reject) => {
                        resolve(result);
                })           
            })
            .then((result) => {
                return new Promise(() => {
                    res.json({ code: 0, msg: '查询成功', result: result});
                    return;
                });
            })
            .catch((e) => {
                console.log(e);
                res.json({ code: -1, msg: '查询失败'});
                return;
            });
    

    --------------------------------------补充-------------------------------------------------

    计数的思想仍然是可以实现的,使用 event 模块即可:

    Antwort
    0
  • 代言

    代言2017-06-29 10:11:23

    由于Promise是异步调用,所以在所有的查询之后使用return,会在还没真正获取到数据之后就返回,所以需要Promise内添加一个计数器count,在所有的Promise下,加一个循环,当所有的doc都循环到了(count == doc.length),才可以输出返回。

    const deasync = require('deasync'); // 引入deasync包
    ...
    let result = []; //存放查询结果
    model.WithdrawModel.find({status: 'processing'}, (err, doc) => {
        if(err) {
            console.log(err);
            res.json({code: -1, msg: '查询失败'});
            return;
        } else {
            let count = 0, len = doc.length;
    
            doc.forEach((item, index) => {
                model.UserModel.findOne({phone: item.phone}, 'name IDcard bank bankCard bank_area bank_name', (err, bankInfo) => {
                    if (err) {
                        console.log(err);
                    } else {
                        let obj = {};
                        Object.assign(obj, JSON.parse(JSON.stringify(item)), JSON.parse(JSON.stringify(bankInfo)));
                        result.push(obj);
                        console.log(result); 
                    }
    
                    count++;
                });
            });
    
            deasync.loopWhile(() => count < len);
    
            res.json({code: 0, msg: '查询成功', result: result});
            return;
        }
    });

    Antwort
    0
  • StornierenAntwort