这是一个非常简单的问题,所以我很惊讶我在这里找不到它。
假设我有以下导入模块的代码:
import("mymodule.js").then(module => {
// Use module
}).catch(e => {
// Handle error
});
因此,我希望在无法检索资源等情况下这将失败,这将得到处理。但是,如果请求收到 403,我会在控制台上收到“GET mysource.js net::ERR_ABORTED 403”错误。一旦请求被缓存,错误就不再出现在每个 import() 上。
我打算使用 import() 来检查模块是否存在并检索它,所以我现在的问题是:
- 对可能不存在/不可访问的资源使用 import() 是不好的做法
- 我是否必须在运行导入之前尝试直接获取资源以避免看似未处理的 403 错误。
最佳答案
根据draft spec text ,如果 import
失败,promise 必须被拒绝。如果您没有看到这一点,那么任何为您处理动态 import
的内容都没有遵循建议的规范文本。
也就是说,我无法在 Chrome v78 中复制它。我设置了一个 Express.js 服务器并为该模块提供 403 回复。我正确地得到了拒绝。这是我在客户端上使用的代码:
function tryIt(label) {
import("./alskdfmod.js")
.then(() => {
console.log(`${label}: Worked`);
})
.catch(e => {
console.log(`${label}: Failed: ${e.message}`);
});
}
tryIt(1);
setTimeout(() => {
tryIt(2);
}, 1000);
我都被拒绝了,1 和 2。
my question now is whether:
- Using import() on resources that may not exist/are inaccessible is bad practice
从某种意义上说,这就是它的目的。
- Would I have to try to get the resource directly before running import to avoid the seemingly unhandled 403 error.
你不应该需要。我会更仔细地查看您的代码,您应该会收到 403 的拒绝(以及 404 和任何其他无法获取模块的错误)。
在您的评论中:
I am getting the rejection, but I'm still getting the error in the console.
啊!我误解了这个问题。是的,网络错误总是在 Chrome 的控制台中显示为错误。 (如果您导航到没有 favicon 的站点,您也会看到 favicon.ico 的 404。)您可以安全地忽略它。如果您没有处理该错误,您会看到一个第二个错误,表示未处理的拒绝。
关于javascript - 通过 import() 检索模块时捕获 403 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58996040/