【问题标题】:not able to make the code await using 'await' till a function completes在函数完成之前,无法使用“等待”使代码等待
【发布时间】:2020-06-28 14:17:00
【问题描述】:

我正在调用一个本地函数,它必须等待该本地函数的结果才能继续。

这是我的本地函数

var Messagehome =  (req, res) => {
  user.find().exec(async (err, user) => {
    if (err) return res.json(err);
    let p = await getfulluser(req.User._id);

    list = user.filter((u) => u._id != req.User._id);

    console.time("time1");
    for (let i = 0; i < p.messages.length; i++) {
      for (let e = 0; e < list.length; e++) {
        if (list[e]._id.equals(p.messages[i]._id)) {
          list.splice(e, 1);
          break;
        } else {
          console.log(list[e].name);
          list[e].password = undefined;
        }
      }
    }
    console.timeEnd("time1");
    return res.json(list), list;
  });
};

exports.Messagehome = Messagehome;

我想在这个函数中使用 Messagehome。它必须等待 Messagehome 继续'for循环'。我尝试了等待,但它没有工作

exports.refreshfind = async (req, res) => {
  let { id } = req.body;

  if (list) {
    console.time("TIME   1");
    for (let e = 0; e < list.length; e++) {
      if (list[e]._id.equals(id)) {
        list.splice(e, 1);
        res.json(list);
        console.timeEnd("TIME   1");
        break;
      }
    }
  }
  if (!list) {
    console.time("TIME    2");
    Messagehome();
    for (let e = 0; e < list.length; e++) {
      if (list[e]._id.equals(id)) {
        list.splice(e, 1);
        res.json(list);
        console.timeEnd("TIME    2");
        break;
      }
    }

  }
};

我收到了这个错误

(node:13396) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'length' of undefined
    at exports.refreshfind (D:\message\backend\controllers\message.js:58:30)
    at Layer.handle [as handle_request] (D:\message\backend\node_modules\express\lib\router\layer.js:95:5)
    at next (D:\message\backend\node_modules\express\lib\router\route.js:137:13)
    at D:\message\backend\controllers\user.js:94:5
    at D:\message\backend\node_modules\jsonwebtoken\verify.js:223:12
    at getSecret (D:\message\backend\node_modules\jsonwebtoken\verify.js:90:14)
    at Object.module.exports [as verify] (D:\message\backend\node_modules\jsonwebtoken\verify.js:94:10)
    at exports.isSignedIn (D:\message\backend\controllers\user.js:89:7)
    at Layer.handle [as handle_request] (D:\message\backend\node_modules\express\lib\router\layer.js:95:5)
    at next (D:\message\backend\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (D:\message\backend\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (D:\message\backend\node_modules\express\lib\router\layer.js:95:5)
    at D:\message\backend\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (D:\message\backend\node_modules\express\lib\router\index.js:335:12)
    at next (D:\message\backend\node_modules\express\lib\router\index.js:275:10)
    at Function.handle (D:\message\backend\node_modules\express\lib\router\index.js:174:3)
(node:13396) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:13396) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
(node:13396) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'User' of undefined
    at D:\message\backend\controllers\message.js:14:35
    at D:\message\backend\node_modules\mongoose\lib\model.js:4599:16
    at D:\message\backend\node_modules\mongoose\lib\utils.js:264:16
    at D:\message\backend\node_modules\mongoose\lib\query.js:4326:11
    at D:\message\backend\node_modules\kareem\index.js:135:16
    at processTicksAndRejections (internal/process/task_queues.js:79:11)
(node:13396) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 2)

它无法从 refreshfind 中的 if( !list ) 中读取“长度”。

我尝试了等待 Messagehome 和 for 循环,但没有成功

 if (!list) {
    console.time("TIME    2");
    Messagehome();
    for (let e = 0; e < list.length; e++) {
      if (list[e]._id.equals(id)) {
        list.splice(e, 1);
        res.json(list);
        console.timeEnd("TIME    2");
        break;
      }
    }

  }
};

【问题讨论】:

  • 是的,你绝对应该使用await Messagehome();。但是,您还需要将 Messagehome 实现修复为 properly promisify user.find().exec()。永远不要将async function 作为回调传递。 (最后但同样重要的是,您为 Messagehome 声明了两个参数,但没有传递任何参数)。
  • 无论user.find().exec 是什么,它都不会返回任何可以等待的东西。我会尝试查看它的文档,看看它是否支持var user = await user.find()。这将使您可以重构代码以正确使用async/await
  • @WiktorZychla 鉴于堆栈跟踪,它似乎是猫鼬,所以是的,这是受支持的并且是正确的解决方案。
  • 是的,它是猫鼬,正如你所说,我在 Messagehome 中使用了 Promise,我将 res 替换为 resolve,但在 req.User._id 中出现错误
  • 我以这种方式使用了 Promise var Messagehome = (req, res) =&gt; new Promise((resolve, reject) =&gt; { 。用resolve 替换res 无效

标签: javascript node.js asynchronous promise


【解决方案1】:

我从实时聊天室得到了一些解决方案。 由于 Messagehome(req,res) 是用 req, res 定义的,所以我得用同样的方式调用它

Messagehome(req,res)

这是行不通的

Messagehome()

我通过研究 promise 找到了剩下的解决方案。 Messagehome 必须是一个基于 promise 的函数,以便在调用时等待。 这是完整的解决方案

var Messagehome =  (req, res) =>  new Promise((resolve, reject) => {
  user.find().exec(async (err, user) => {
    if (err) return res.json(err);
    let p = await getfulluser(req.User._id);

    list = user.filter((u) => u._id != req.User._id);

    console.time("time1");
    for (let i = 0; i < p.messages.length; i++) {
      for (let e = 0; e < list.length; e++) {
        if (list[e]._id.equals(p.messages[i]._id)) {
          list.splice(e, 1);
          break;
        } else {
          console.log(list[e].name);
          list[e].password = undefined;
        }
      }
    }
    console.timeEnd("time1");
     res.json(list);
     resolve (list)
  });
})

exports.Messagehome = Messagehome;

由于 Messagehome 是基于 Promise 的函数,它会等到该 Promise 完成。所以我可以在 Refreshfind 中从 Messagehome 获取列表

exports.refreshfind = async (req, res) => {
  let { id } = req.body;

  if (list) {
    console.time("TIME   1");
    for (let e = 0; e < list.length; e++) {
      if (list[e]._id.equals(id)) {
        list.splice(e, 1);
        res.json(list);
        console.timeEnd("TIME   1");
        break;
      }
    }
  }
  if (!list) {
    console.time("TIME    2");
   await Messagehome(req,res);
    for (let e = 0; e < list.length; e++) {
      if (list[e]._id.equals(id)) {
        list.splice(e, 1);
        res.json(list);
        console.timeEnd("TIME    2");
        break;
      }
    }

  }
};

现在 await 真的要等我了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    相关资源
    最近更新 更多