我有这个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中不起作用,我什么也没得到。
答案 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"));