javascript - 为什么 Await 不阻塞下一行代码?
问题描述
我正在使用异步函数来启动服务器,检查 url 是否返回200
,然后运行我的测试,但是checkUrl
在运行下一行代码之前我的函数没有完成。
我正在使用axios
包来 ping 状态代码的 url,并且我一直在尝试 async/await 和Promise.resolve()
.
function checkUrl(url) {
console.log(`Checking for ${url}`);
return axios
.get(url)
.then(function(res) {
const message = `${url} is status code: ${res.status}`;
return res;
})
.catch(function(err) {
console.log("Will check again in 5 seconds");
setTimeout(() => {
return checkUrl(url);
}, 5000);
});
}
async function init() {
let val;
console.log("Running tests:::");
// start server in react-integration directory
shell.exec("BROWSER=none yarn start", {
cwd: "sampleIntegration/react-integration",
async: true
});
// check server has started
val = await checkUrl("http://localhost:3000");
console.log(`value from checkUrl promise: ${val}`);
}
我期望 val 变量是从Promise.resolve()
我的checkUrl
函数中返回的消息。
val
回来未定义。
解决方案
问题是,setTimeout
在 catch 块中。这是异步的,但 catch 块会立即返回。因为它没有任何东西要返回,所以它返回 undefined。要解决此问题(并保持您期望的等待行为),您可以执行以下操作:
function checkUrl(url) {
console.log(`Checking for ${url}`);
return axios.get(url)
.then(res => {
const message = `${url} is status code: ${res.status}`;
return res;
})
.catch(err => {
console.log('Will check again in 5 seconds');
return new Promise((resolve) => {
setTimeout(resolve, 5000);
}).then(() => checkUrl(url));
});
}
这将使 Promise 在 5 秒后解析,并在解析时调用 checkUrl。
推荐阅读
- javascript - 如何在字符串数组中找到最长的公共前缀?
- reactjs - 使用反应测试库和 Jest 测试 Amplify Cognito Auth.SignIn()
- python - 带有字母数字和破折号的正则表达式,没有前导和尾随破折号
- matplotlib - 将 2 个不同的蒙版应用于 seaborn 热图或手动更改单元格的颜色
- c# - 尝试对 ASP.NET Core 3.1 使用多个身份验证方案时出现异常
- r - R:Facet_Grid 标签放置
- javascript - 如果我不按住鼠标左键单击,输入字段会失去焦点
- c# - 带有 ChromeDriver 的 C# 无头代理身份验证
- c - 在 C 中匹配 Python 模数/余数
- kubernetes - 如何在 kubernetes 密钥中使用连字符键和连字符?