测试 React PWA 是否在线的函数从不 returns false
Function that tests if React PWA is online never returns false
我正在使用 ReactJS 创建一个渐进式网络应用程序。我的应用程序需要确定它是否能够连接到我的服务器,以便它知道如何处理提交的数据。为此,我正在尝试编写一个函数,当且仅当对我的服务器的 HEAD 请求成功时 returns 为真。
我在桌面上使用 Chrome 来测试我的应用程序,我的服务器通过本地主机托管在我的桌面上。为了测试我的功能,我在我的应用程序上创建了一个临时按钮,当我单击它时它会运行该功能。然后,我在 Chrome devtools 上尝试不同的网络节流设置组合,并手动连接和断开我的服务器。只有当我的服务器已连接并且没有网络限制时,我才期望得到正输出。但是,我从来没有收到负输出。
我不确定我的测试方法是否可行,我也不确定我解决这个问题的方法是否正确。我对其他解决方案 and/or 测试方法持开放态度。有什么想法吗?
这是我的函数代码:
const isOnline = async () => {
if (!window.navigator.onLine) return false;
// I use the origin to prevent CORS errors
const url = new URL(window.location.origin);
// Set a random search parameter to make sure no request falls back on the cache
url.search = new URLSearchParams({
isonline: createId(), // Returns a random string of a certain length
});
try {
// HEAD request is sufficient for my needs
const response = await axios.head(url.toString());
console.log(response);
// Return true if the request was valid
if (response.status >= 200 && response.status <= 299) return true;
else return false;
} catch {
return false;
}
};
这是我的按钮事件处理程序代码:
const onClickIsOnline = () => {
isOnline() ? console.log('Online!') : console.log('Offline :(');
};
isOnline
定义为 async
function, which means the return value will always be a Promise
.
一个Promise
对象是一个truthy value,所以你的
jsisOnline() ? console.log('Online!') : console.log('Offline :(');
代码 应该 总是以记录 Online!
.
结束
我相信您的意图是 use Promise
解析的值以确定您记录的内容。最直接的方法是将 then()
链接到 Promise
:
jsisOnline().then(returnValue => {
returnValue ? console.log('Online!') : console.log('Offline :(');
});
我正在使用 ReactJS 创建一个渐进式网络应用程序。我的应用程序需要确定它是否能够连接到我的服务器,以便它知道如何处理提交的数据。为此,我正在尝试编写一个函数,当且仅当对我的服务器的 HEAD 请求成功时 returns 为真。
我在桌面上使用 Chrome 来测试我的应用程序,我的服务器通过本地主机托管在我的桌面上。为了测试我的功能,我在我的应用程序上创建了一个临时按钮,当我单击它时它会运行该功能。然后,我在 Chrome devtools 上尝试不同的网络节流设置组合,并手动连接和断开我的服务器。只有当我的服务器已连接并且没有网络限制时,我才期望得到正输出。但是,我从来没有收到负输出。
我不确定我的测试方法是否可行,我也不确定我解决这个问题的方法是否正确。我对其他解决方案 and/or 测试方法持开放态度。有什么想法吗?
这是我的函数代码:
const isOnline = async () => {
if (!window.navigator.onLine) return false;
// I use the origin to prevent CORS errors
const url = new URL(window.location.origin);
// Set a random search parameter to make sure no request falls back on the cache
url.search = new URLSearchParams({
isonline: createId(), // Returns a random string of a certain length
});
try {
// HEAD request is sufficient for my needs
const response = await axios.head(url.toString());
console.log(response);
// Return true if the request was valid
if (response.status >= 200 && response.status <= 299) return true;
else return false;
} catch {
return false;
}
};
这是我的按钮事件处理程序代码:
const onClickIsOnline = () => {
isOnline() ? console.log('Online!') : console.log('Offline :(');
};
isOnline
定义为 async
function, which means the return value will always be a Promise
.
一个Promise
对象是一个truthy value,所以你的
jsisOnline() ? console.log('Online!') : console.log('Offline :(');
代码 应该 总是以记录 Online!
.
我相信您的意图是 use Promise
解析的值以确定您记录的内容。最直接的方法是将 then()
链接到 Promise
:
jsisOnline().then(returnValue => {
returnValue ? console.log('Online!') : console.log('Offline :(');
});