Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何使用async Wait with promise获得我的结果?_Node.js_Foreach_Promise_Async Await_Synchronous - Fatal编程技术网

Node.js 如何使用async Wait with promise获得我的结果?

Node.js 如何使用async Wait with promise获得我的结果?,node.js,foreach,promise,async-await,synchronous,Node.js,Foreach,Promise,Async Await,Synchronous,我有一个函数应该返回一个结果 我有一个数组,在这个数组上我做了一个foreach,我用一个函数从数据库中获取数据,该函数对数组上的每个id都有承诺, 调用最后一个函数时,我使用async await,但在执行函数之前返回最终结果 控制器用户 我收到一个空结果,在控制台中,我有成功返回调用后显示的结果 { "success": true, "data": [] } 如何获得结果?将foreach循环更改为for循环,并按预期工作 myFunction: function (req

我有一个函数应该返回一个结果

我有一个数组,在这个数组上我做了一个foreach,我用一个函数从数据库中获取数据,该函数对数组上的每个id都有承诺, 调用最后一个函数时,我使用async await,但在执行函数之前返回最终结果

控制器用户

我收到一个空结果,在控制台中,我有成功返回调用后显示的结果

{
    "success": true,
    "data": []
}

如何获得结果?

将foreach循环更改为for循环,并按预期工作

myFunction: function (req, res) {
let headerAuth = req.headers['authorization'];
let login = utils.getUser(headerAuth);
if (login) {
    //some function to get data from database
    ModelUsers.getData(login, async function (err1, result) {
        if (!err1) {
            let data = [];
            for (let index = 0; index < result.length; index++) {
                const element = result[index];
                let dataxx = await ModelUsers.getDataWithPromise(r._id);
                data.push(dataxx);
            }
            res.json({ success: true, data: data })
        }
    })


}

将foreach循环更改为for循环,并按预期工作

myFunction: function (req, res) {
let headerAuth = req.headers['authorization'];
let login = utils.getUser(headerAuth);
if (login) {
    //some function to get data from database
    ModelUsers.getData(login, async function (err1, result) {
        if (!err1) {
            let data = [];
            for (let index = 0; index < result.length; index++) {
                const element = result[index];
                let dataxx = await ModelUsers.getDataWithPromise(r._id);
                data.push(dataxx);
            }
            res.json({ success: true, data: data })
        }
    })


}

您可以通过以下两种方式修复此问题:

如果登录{ //从数据库中获取数据的一些函数 ModelUsers.getDatalogin,函数err1,结果{ 如果!错误1{ 让数据=[]; result.forEachasync函数,idx{ //带承诺的功能,请参见下一步 让dataxx=等待ModelUsers.getDataWithPromiser.\u id; data.pushdataxx; console.log**dataxx:,dataxx 如果result.length==idx+1{ res.json{ 成功:没错, 数据:数据 } } } } }
} 您可以通过以下两种方式修复此问题:

如果登录{ //从数据库中获取数据的一些函数 ModelUsers.getDatalogin,函数err1,结果{ 如果!错误1{ 让数据=[]; result.forEachasync函数,idx{ //带承诺的功能,请参见下一步 让dataxx=等待ModelUsers.getDataWithPromiser.\u id; data.pushdataxx; console.log**dataxx:,dataxx 如果result.length==idx+1{ res.json{ 成功:没错, 数据:数据 } } } } } } forEach是异步的。for或for of循环是同步的,在这种情况下可以使用for of循环。我增加了一个例子。注意getData回调中的async关键字

  myFunction: function(req, res) {
   let headerAuth = req.headers['authorization'];
   let login = utils.getUser(headerAuth);
   if (login) {
     //some function to get data from database
     ModelUsers.getData(login, async function(err1, result) {
       if (!err1) {
         let data = [];

         for (let user of result) {
           let dataxx = await ModelUsers.getDataWithPromise(r._id);
           data.push(dataxx);
         }

         res.json({ success: true, data: data })
       }
     })


   }
 }
forEach是异步的。for或for of循环是同步的,在这种情况下可以使用for of循环。我增加了一个例子。注意getData回调中的async关键字

  myFunction: function(req, res) {
   let headerAuth = req.headers['authorization'];
   let login = utils.getUser(headerAuth);
   if (login) {
     //some function to get data from database
     ModelUsers.getData(login, async function(err1, result) {
       if (!err1) {
         let data = [];

         for (let user of result) {
           let dataxx = await ModelUsers.getDataWithPromise(r._id);
           data.push(dataxx);
         }

         res.json({ success: true, data: data })
       }
     })


   }
 }
forEach方法不支持异步函数。您可以使用Array.map将每个值转换为承诺,然后等待它们完成承诺。全部:

forEach方法不支持异步函数。您可以使用Array.map将每个值转换为承诺,然后等待它们完成承诺。全部:


探险家:你说ForEach是同步的,但是我们需要它来同步这个问题,对吗?如果它是异步的,那么我们应该有当前的问题Explorer:你说ForEach是同步的,但是我们需要它在这个问题上是同步的,对吗?如果它是异步的,那么我们应该有当前的问题谢谢你的回复,我使用map with promise all是新的,但是我有一些其他代码,我必须使用循环谢谢你的回复,我使用map with promise all是新的,但是我有一些其他代码,如果我删除async Wait,我也必须使用循环,我有结果,为什么?如果我删除async Wait,我有结果,为什么?
ModelUsers.getData(login, async function (err1, result) {
    if (!err1) {
        const data = await Promise.all(result.map(({_id}) => ModelUsers.getDataWithPromise(_id)))
        res.json({success: true, data})
    }
})