并行异步猫鼬查询|| eval(return)SyntaxError:非法的return语句

时间:2019-10-13 15:42:54

标签: javascript mongodb mongoose

我正试图用Mongoose向Mongo提出很多要求。我希望它们是并行和异步的。我不知道我可能要查询多少个,所以我创建了这个辅助函数。尽管我不确定我的评估用法,但它工作正常。问题是eval(return $ {returnStr})给了我SyntaxError。

const batchRetrieve = async (query, models) => {
  models.forEach((model, i) => {
    eval(`task${i} = ${model}.findOne(query)`);
  });
  let str = [];
  for (let i = 0; i < models.length; i++) {
    str.push(`res${i}: await task${i}`);
  }

  const joinedStr = Array.prototype.join.call(str, ', '); //output is 'res0: await task0, res1: await task1'

  //    return { res0: await task0, res1: await task1 }; works fine 
  eval(`return { ${joinedStr} };`);
};

2 个答案:

答案 0 :(得分:1)

经验法则:如果您使用的是eval,那么您做错了。试试这个:

const batchRetrieve = async (query, models) => {
  const promises = [];
  models.forEach(model => {
    promises.push(model.findOne(query));
  });

  const results = [];
  for (let i = 0; i < models.length; i++) {
    results.push(await promises[i]);
  }

  return results;
};

答案 1 :(得分:0)

替换eval(return { ${joinedStr} };);

  return eval(`(async () => {
        return { ${joinedStr} }
    })();`);

解决了我的问题。