我可以使用`fetch`从另一个运行JS脚本吗?
在这里降低中级JS / JQ人。
我试图通过使用JS fetch
来逃避回调地狱。 这被称为“AJAX的替代品”,似乎非常强大。 我可以看到你如何用它来获取HTML和JSON对象……但是它能够运行你所在的另一个JS脚本吗? 也许ES6中还有另一个新function:
$.getScript( 'xxx.js' );
即
$.ajax({ url : 'xxx.js', dataType : "script", });
…?
后来,回应约瑟夫梦想家:
试过这个:
const createdScript = $(document.createElement('script')).attr('src', 'generic.js'); fetch( createdScript )...
…它没有运行脚本“generic.js”。 你的意思是什么?
Fetch API应该提供基于promise的API来获取远程数据。 加载随机远程脚本不是 AJAX – 即使jQuery.ajax
能够做到这一点。 它不会由Fetch API处理。
脚本可以动态附加并包含一个承诺:
const scriptPromise = new Promise((resolve, reject) => { const script = document.createElement('script'); document.body.appendChild(script); script.onload = resolve; script.onerror = reject; script.async = true; script.src = 'foo.js'; }); scriptPromise.then(() => { ... });
SystemJS应该为脚本加载提供基于promise的API,也可以使用:
System.config({ meta: { '*': { format: 'global' } } }); System.import('foo.js').then(() => { ... });
这里有一些事情需要提及。
是的,可以执行刚刚从服务器加载的javascript。 您可以将文件作为文本和用户eval(…)获取,但不建议这样做,因为副作用难以置信且缺乏安全性!
另一种选择是:1。加载javascript文件2.使用文件内容(或url,因为浏览器缓存文件)创建脚本标记
这有效,但它可能无法让你从回调地狱中解脱出来。
如果您想要的是加载其他javascript文件,您可以使用,例如requirejs,您可以定义模块并以dinamically方式加载它们。 看看http://requirejs.org/
如果你真的想摆脱回调地狱,你需要做的是
- 定义函数(您可以将它们放在同一个文件中,或者使用客户端中的requirejs从另一个文件加载,或者如果您在部署之前可以负担得起编译,则加载webpack)
- 如果需要,使用promises或streams(参见Rxjs https://github.com/Reactive-Extensions/RxJS )
-
记住,promise.then返回一个承诺
someAsyncThing() .then(doSomethingAndResolveAnotherAsncThing) .then(doSomethingAsyncAgain)
请记住,承诺可以组成
Promise.all(somePromise, anotherPromise, fetchFromServer) .then(doSomethingWhenAllOfThoseAreResolved)