首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我在try-catch中使用setTimeout时,返回not work

当我在try-catch中使用setTimeout时,返回not work
EN

Stack Overflow用户
提问于 2018-08-01 19:53:27
回答 1查看 238关注 0票数 1

我有这个try-catch代码块:

代码语言:javascript
复制
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
    };
  }
}

我的用法如下:

代码语言:javascript
复制
matchMaking(userId).then(res => {
  if (res.success) {
    console.log("success")
  } else {
    console.log("failed")
  }
});

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-01 21:15:14

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

代码语言:javascript
复制
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
            });
        }
    });
}

这样,当您像这样调用它时-它将按照预期运行:

代码语言:javascript
复制
matchMaking(userId).then(res => {
  if (res.success) {
    console.log("success")
  } else {
    console.log("failed")
  }
});

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

代码语言:javascript
复制
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()来处理失败状态:

代码语言:javascript
复制
matchMaking(userId)
    .then(res => console.log("success"))
    .catch(err => console.log("failed"));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51632636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档