【问题标题】:Calling Async function that contains Promise inside returning undefined调用包含 Promise 的异步函数返回 undefined
【发布时间】:2019-01-27 00:39:35
【问题描述】:

我正在尝试根据我在 app.rutine 中的数据库中获得的内容执行某些功能:

return Promise.all(finalApps.map(app => {
       return counts.push(setRutine(**app.rutine**));
}))

并试图将函数的返回推入 counts 数组中,如图所示

但我不断收到 Promise { } 或 Promise { undefined }

这是 setRutine 异步函数:

async function setRutine(nameF) {
    if(nameF == "countUsers") {
        console.log("YES; IT IS");
        await countUsers().then((count) => {
            console.log("FROM IF STATEMENT: " + count);
            return count;
        })
    } else {
      return "";
    }
}

如果从 db 获得的信息是返回 Promise 的 countUsers,则它调用 countUsers() 函数

function countUsers() {
    var db = admin.firestore();
    var usersRef = db.collection('users');

    var count = {};

    return new Promise ((resolve, reject) => {
        return usersRef.get().then(function(querySnapshot) {      
            count.size = querySnapshot.size;
            count.id = "1";
        })
        .then(() => {
            console.log("FROM countFunction: " + count);
            resolve(count);
        })
        .catch((error) => {
            reject(error);
        })
    });
}

感谢您的帮助!

【问题讨论】:

  • 如果nameF 不等于countUsers ,那么您将返回一个未定义的结果
  • 这里的问题太多了。您将 async/await 与 then/catch 混合在一起,您有不必要的使用 new Promise,并且您正在尝试将异步函数的返回值推送到数组中(这始终是一个承诺) .您可能需要考虑查看 async/await 的实际工作原理,因为这里没有简单的修复方法。

标签: javascript node.js firebase promise async-await


【解决方案1】:

感谢您的所有回答,你们帮助我更好地理解了我的问题,Doug Stevenson 是对的,我将 setRutine 函数更改为返回 Promise 而不是异步函数。

我贴出代码:

function setRutine(nameF) {
    return new Promise( (resolve, reject) => {
        if(nameF == "countUsers") {
            return countUsers().then((count) => {
                resolve(count);
            }).catch((error) => {
                reject(error);
            })
        }
    });
}

【讨论】:

    【解决方案2】:

    你必须从setRutine返回一些东西,可能是promises的结果:

     return await countUsers() /*...*/
    

    【讨论】:

    • 这不足以修复代码中的所有问题。请参阅我上面的评论。
    猜你喜欢
    • 2018-07-09
    • 2019-12-29
    • 2021-06-05
    • 2020-07-09
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    相关资源
    最近更新 更多