在try-catch中使用setTimeout时返回不起作用

时间:2018-08-01 11:53:27

标签: javascript node.js typescript

我有这个try-catch块:

async function matchMaking(userId) {
  try {

    const user = await User.findOne({
      _id: userId
    });

    var timeOut1 = setTimeout(function() {
      return {
        success: false,
        msg: "matchMaking aleready done"
      };
    }, 20000);

    //some code
    if (match === true) {
      clearTimeout(timeOut1);
      return {
        success: true
      };
    }

  } catch (e) {
    return {
      success: false,
      error: e
    };
  }
}

我按如下方式使用它:

matchMaking(userId).then(res => {
  if (res.success) {
    console.log("success")
  } else {
    console.log("failed")
  }
});

当(match === true)正常时,我在控制台中获得“成功”,但是当(match === false)时,我希望20秒后在控制台中看到“失败”。 但是return在setTimeout中不起作用,我什么也没得到。

1 个答案:

答案 0 :(得分:0)

您需要从matchMaking函数返回一个Promise

async function matchMaking (userId) {

    return new Promise((res, rej) => {
        const user = await User.findOne({
            _id: userId
        });
        var timeOut1 = setTimeout(function() {
            return res({
                success: false,
                msg: "matchMaking aleready done"
            });
        }, 20000);

        if (match === true) {
            clearTimeout(timeOut1);
            return res({
                success: true
            });
        }
    });
}

这样,当您这样称呼它时-它会表现出预期的效果:

matchMaking(userId).then(res => {
  if (res.success) {
    console.log("success")
  } else {
    console.log("failed")
  }
});

一种更好的处理方法是使用promise的reject回调:

async function matchMaking (userId) {

    return new Promise((res, rej) => {
        const user = await User.findOne({
            _id: userId
        });
        var timeOut1 = setTimeout(function() {
            return rej({
                success: false,
                msg: "matchMaking aleready done"
            });
        }, 20000);

        if (match === true) {
            clearTimeout(timeOut1);
            return res({
                success: true
            });
        }
    });
}

这样,当您这样调用时-您可以使用.catch()处理失败状态:

matchMaking(userId)
    .then(res => console.log("success"))
    .catch(err => console.log("failed"));