如何正确解决nodejs中的承诺

时间:2020-05-20 11:53:06

标签: node.js

const findusers=(commentarr)=>{
    return new Promise((resolve,reject)=>{
        let final_comment_arr=[];
        commentarr.forEach(element=>{
            comment.findOne({_id:element}).then(result_comment=>{
                final_comment_arr.push(result_comment);
            });
        })
        resolve(final_comment_arr);
        reject(new Error('failed to find users'));
    })
}

当我解析数组时,它返回一个空数组如何解决此问题

2 个答案:

答案 0 :(得分:0)

我看到您使用mongodb,有一个$in可以找到该数组中的所有ID,而不是循环遍历。

const findusers=(commentarr)=>{
    return new Promise(async(resolve,reject)=>{
       let result = await comment.find({ _id: { $in: commentarr }})
       if(result.length < 1){
          reject(new Error('failed to find users'));
       }else {
          resolve(result);
       }
    })
}

我不确定result是返回数组还是只是null。也许您可以通过控制台登录并签出

答案 1 :(得分:0)

因此您的comment.findOne是一个异步呼叫。您可以调试它以查看异步调用的顺序。我的意思是您有一个rica条件,可能在解决resolve(final_comment_arr);中的任何一个问题之前调用了comment.findOne。您可以将解决方案更改为:

    const findusers=(commentarr)=>{
         return new Promise((resolve,reject)=>{
             let commentsPromises = commentarr.map(element=> comment.findOne({_id:element}))
             resolve(Promise.all(commentsPromises)) // resolve is like a return for Promie
    })
}

Promise.all是一个函数,它接受promise的数组并在每个promise解析时返回结果

(注意:我没有运行此代码,因此可能存在一些语法错误)

为了简化解决示例,我删除了此错误处理

您可以将我的示例简化为:

    const findusers=(commentarr)=>
         Promise.all(commentarr.map(element=> comment.findOne({_id:element})))