初级JS/JQ人员。
我试图通过使用JS fetch
来逃离回调地狱。这被称为“ AJAX 的替代品”,似乎非常强大。我可以看到你如何用它来获取HTML和JSON对象。但是它能运行另一个JS脚本吗?也许ES6中还有另一个新功能要做:
$.getScript( 'xxx.js' );
即
$.ajax({ url : 'xxx.js', dataType : "script", });
...?
后来,回应约瑟夫梦想家:
尝试了这个:
const createdScript = $(document.createElement('script')).attr('src', 'generic.js');
fetch( createdScript )...
...它没有运行脚本“generic.js”。你是指别的吗
6条答案
按热度按时间hwamh0ep1#
Fetch API应该提供基于Promise的API来获取远程数据。加载随机远程脚本不是 AJAX --即使
jQuery.ajax
能够做到这一点。它不会被Fetch API处理。脚本可以动态追加并使用promise Package :
SystemJS应该为脚本加载提供基于Promise的API,并且也可以使用:
nhjlsmyf2#
这里有几件事要提一下。
是的,可以执行刚从服务器加载的JavaScript。您可以以文本和用户eval(...)的形式获取文件,但由于无法跟踪的副作用和缺乏安全性,不建议这样做!
另一种选择是:1.加载JavaScript文件2.用文件内容(或URL,因为浏览器缓存文件)创建一个脚本标记
这是可行的,但它可能无法从回调地狱中解放出来。
如果你想要的是加载其他你可以使用的JavaScript文件,例如requirejs,你可以定义模块并加载它们。查看http://requirejs.org/
如果你真的想摆脱回调地狱,你需要做的是
记住Promise是可以组合的
bjp0bcyl3#
是的你可以
不要听选择的“正确”答案。
wj8zmpe14#
遵循
fetch()
API对我来说非常好,正如@cnexans的回答所建议的那样(使用.text()
,然后使用.eval()
)。我注意到与添加<script>
标记的方法相比,性能有所提高。运行代码片段查看
fetch()
API加载async(因为是Promise):ovfsdjhp5#
Fetch API提供了用于获取资源(包括通过网络)的接口。对于使用过XMLHttpRequest的人来说,它似乎很熟悉,但新的API提供了更强大、更灵活的特性集。https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API
这就是它应该做的,但不幸的是,它不评估脚本。
这就是为什么我在Github上发布了这个小小的Fetch data loader。
它将获取的内容加载到目标容器中并运行其脚本(不使用邪恶的
eval()
函数)。这里有一个演示:https://www.ajax-fetch-data-loader.miglisoft.com
下面是一个示例代码:
fsi0uk1n6#
要实际使用动态加载的.js文件中的变量,需要等待文件加载完成。下面的方法将
fetch
Package 在Promise
中,以便轻松调用async/await
。将
script
标记添加为blob
还简化了使用script-src-elem 'self' blob:;
而不是nonce的CSP配置。整个解决方案比使用eval()
更安全。