具有地图功能的同步代码

时间:2018-08-06 15:56:07

标签: javascript asynchronous promise async-await

我认为我完全迷路了,我认为我至少对异步方面有所了解,但是这种特殊情况使我感到困惑。

我在数据库上执行搜索,并期望得到一系列结果。 然后我遍历数组,检查标志并将信息推送到数组。

但是,我在进行异步调用时出错,因为在我控制台记录finalData时,它始终为空,因此它会在应该解决之前进行解析。

这是我的尝试,尝试了两种方式:

let finalData = [];

let lastWeek = new Date();
lastWeek.setDate(lastWeek.getDate() - 7);

db.find({ createdAt: { "$gte": lastWeek } }).then((records, err) => {

    async function test() {
        let array = _.map(records, (record) => {
            db2.find({ 'foo': record.id }).then((bar, err) => {

                if (bar.endDate) {
                    let data = `Email: ${record.email}`;
                    finalData.push(data);
                } else {
                    let data = `Email: ${record.email}`;
                    finalData.push(data);
                }
            });
        });

        await Promise.all(array).then(() => {
            console.log(finalData);
        });

    }

    test();
});

和:

db.find({ createdAt: { "$gte": lastWeek } }).then((records, err) => {

    let promise1 = new Promise((resolve, reject) => {
        _.map(records, (record) => {
            db2.find({ 'foo': record.id }).then((bar, err) => {

                if (bar.endDate) {
                    let data = `Email: ${record.email}`;
                    finalData.push(data);
                } else {
                    let data = `Email: ${record.email}`;
                    finalData.push(data);
                }
            });
        });

        resolve();
    });

    promise1.then(() => {
        console.log(finalData);
    })
});

结果相同,我做错了。

1 个答案:

答案 0 :(得分:1)

  • 您的基本尝试看起来不错,您只是忘记了return回调中的map承诺,因此array实际上是undefined值的数组,而不是承诺的数组
  • 您不需要该finalData数组即可手动push到。只需用各自的价值解决您的承诺,Promise.all就会将它们收集到一系列结果中
  • then回调不需要第二个err参数-如果您的函数已经返回了Promise,则它 调用实现回调或拒绝回调。< / li>
  • 请勿混用thenasync / await样式

let lastWeek = new Date();
lastWeek.setDate(lastWeek.getDate() - 7);

const records = await db.find({ createdAt: { "$gte": lastWeek } });
let promises = records.map(async (record) => {
    const bar = await db2.find({ 'foo': record.id });
    if (bar.endDate) {
        return `Email: ${record.email}`;
    } else {
        return `Email: ${record.email}`;
    }
});

const finalData = await Promise.all(promises)
console.log(finalData);

或者:

let lastWeek = new Date();
lastWeek.setDate(lastWeek.getDate() - 7);

return db.find({ createdAt: { "$gte": lastWeek } }).then(records => {
    let promises = records.map(record => {
        return db2.find({ 'foo': record.id }).then(bar => {
//      ^^^^^^
            if (bar.endDate) {
                return `Email: ${record.email}`;
//              ^^^^^^
            } else {
                return `Email: ${record.email}`;
//              ^^^^^^
            }
        });
    });
    return Promise.all(promises);
//  ^^^^^^
}).then(finalData => {
    console.log(finalData);
});