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

using callback in a function in node.js

我有这样的代码:

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})
    }
})

我想让 "do something part" 成为这样的函数:

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})
    }
})

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

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

然后,假设您的 async.mapLimit 是基于回调的函数。您可以用 promise 包装回调函数,然后生成异步等待函数(return 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})
  }
})

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