通过Promises异步加载外部js文件的最佳方式
Best way to asynchronously load external js files via Promises
我正在建立一个使用一些外部js文件的网站。我通过下面的代码加载文件,但是如果一个或多个文件下载失败,我不确定如何继续。我是否应该一直请求它们直到它们全部下载?是否为每个文件做一个单独的onload事件更好?我如何知道哪个文件加载失败,需要再次请求?
var filesToLoad = ["https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"];
var loader = new ScriptLoader();
filesToLoad.forEach(function(file) {
loader.add(file);
});
loader.loaded(function(failedCallbackF) {
console.log("Error.");
//Try getting the files again??
});
function ScriptLoader() {
var promises = [];
this.add = function(url) {
var promise = new Promise(function(resolve, reject) {
var script = document.createElement('script');
script.src = url;
script.addEventListener('load', function() {
resolve(script);
}, false);
script.addEventListener('error', function() {
reject(script);
console.log('was rej');
}, false);
document.body.appendChild(script);
});
promises.push(promise);
};
this.loaded = function(callbackOnFailed) {
Promise.all(promises).then(function(result1) {
console.log('Script loaded from:', result1);
}, callbackOnFailed);
};
}
嗯,有一个官方的API叫做"动态导入",我建议你使用它或使用它(像SystemJS或像webpack这样支持它的工具)。
import("yourScriptFile.js").then(function(){
// script loaded.
});
如果你想加载多个文件,你也可以使用它:
Promise.all(["url1", "url2"].map(System.import)).then(function(){
// loaded all here
});
也许这对你有帮助。
var filesToLoad = ["https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"];
filesToLoad.forEach(function(file) {
var loader = new ScriptLoader();
loader.add(file)
loader.loaded(function(failedCallbackF) {
console.log("Error.");
//reload this file
});
});
function ScriptLoader() {
var promises = [];
this.add = function(url) {
var promise = new Promise(function(resolve, reject) {
var script = document.createElement('script');
script.src = url;
script.addEventListener('load', function() {
resolve(script);
}, false);
script.addEventListener('error', function() {
reject(script);
console.log('was rej');
}, false);
document.body.appendChild(script);
});
promises.push(promise);
};
this.loaded = function(callbackOnFailed) {
Promise.all(promises).then(function(result1) {
console.log('Script loaded from:', result1);
}, callbackOnFailed);
};
}
相关文章:
- 什么's是连接供应商js文件的最佳方式
- 将大数组(字符串和类型数组的混合物)存储到blob或文件中/从blob或文件检索大数组的最佳方式
- 节点:'最佳实践'使用其他js文件的js文件
- ExtJS类的最佳实践最终导致了太多的.JS文件.性能怎么样
- 在企业应用程序框架中包含js/css文件的最佳实践是什么
- 在d3.json中使用d3.csv组合多个csv文件数据输入的最佳方法是什么
- 将文件夹中的所有图像包括在阵列中的最佳方式是什么
- 最佳实现:将图像文件上传到数据库,并从数据库中读取图像
- 通过http传输大文件(>100MB)的最佳方式
- Jade包含JavaScript文件的最佳实践
- 链接不同 Web 文件夹中的图像/文件的最佳实践
- Web 项目的文件夹/目录结构 - 最佳做法
- 使用标记和 (TXT) .dat 文件中追加信息的最佳方式.从窗体
- 从 Javascript 读取硬编码 csv 文件的最佳实践
- 在 Node.JS 中使用配置文件的最佳方式
- 加载正确的PhoneGap文件的最佳方法是什么
- 整合多个 Javascript 文件的最佳实践是什么?
- 让目录中的所有文件都成为 webpack 中的入口点的最佳方法
- 通过web应用程序下载文件[最佳实践]
- 将JavaScript代码拆分为几个文件:最佳实践