在node.js中的函数中使用回调

时间:2019-09-15 06:18:47

标签: node.js express async.js asynccallback

我有这样的代码:

router.post('/call' , async (req , res)=>{
    try{
        await async.mapLimit(req.body.n , 5 , (id , callback)=> {
            ////do something
            callback("message")
        }, (err , rest)=>{
            if(err){
                res.json({message : err})
            }else{
                res.json({message : rest})
            }
        })

    }catch(err){
        res.json({message : err})
    }
})

我想使“执行某些操作”这样的功能:

router.post('/call' , async (req , res)=>{
    try{
        await async.mapLimit(req.body.n , 5 , (id , callback)=> {
            addStudentID(req , res , id , callback)
        }, (err , rest)=>{
            if(err){
                res.json({message : err})
            }else{
                res.json({message : rest})
            }
        })

    }catch(err){
        res.json({message : err})
    }
})

我的问题是,似乎无法将回调作为参数发送给另一个函数,有解决方案吗?

2 个答案:

答案 0 :(得分:0)

首先,函数声明中的异步是没有用的,除非您等待promise函数(async-await函数)。但是我不知道为什么将函数作为回调传递给promise函数(异步等待函数)。

然后,假设您的async.mapLimit是基于回调的函数。您可以将您的回调函数与promise包装在一起,然后产生async-await函数(返回promise的函数),如下所示:

function async.mapLimitPromise(firstArgument, secondArgument) {
  return new Promise(function(resolve, reject) {
    async.mapLimit(firstArgument, secondArgument, function(err, data) {
    if (err) {
      reject(err)
    }
    resolve(data)
  })
})

还有一件事。我不明白您为什么将一个函数(您的回调)作为async.mapLimit函数的第三个参数传递,但是随后它收到一个回调作为第二个参数?

我建议您先阅读有关回调函数的更多信息,然后再阅读Promise,最后再尝试使用异步函数

---编辑---

首先尝试使用此代码:

router.post('/call' , async (req , res)=>{
  try{
    const res = await async.mapLimit(req.body.n , 5 , (id , callback)=> {
      addStudentID(req , res , id , callback)
    })
    res.json({message : rest})

  }catch(err){
    res.json({message : err})
  }
})

答案 1 :(得分:0)

问题是函数使用和函数声明不同步而不是回调部分