为了账号安全,请及时绑定邮箱和手机立即绑定

关于Promise的一段代码的疑问

关于Promise的一段代码的疑问

慕的地10843 2018-09-19 10:22:06
import { Promise } from 'es6-promise';function loadScript(url) {let script = Array.from(document.scripts).find((s) => s.src === url);  if (script) {    return Promise.resolve(url);//①  }  return new Promise(function(resolve, reject) { //②        script = document.createElement('script');        script.addEventListener('load',  function() { resolve(url); }, false);        script.addEventListener('error', function() { reject(url); }, false);        script.src = url;        document.body.appendChild(script);    });1、②处是定义了一个Promise对象,和①处的区别是什么?2、①处Promise.resolve(url) 为什么把这个url放进去?这段代码的意思不应该是该url加载完之后,执行。 它怎么知道url什么时候加载完?
查看完整描述

1 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

  1. ①这是Promise的简略写法,和②其实是一样的,①这里可以等同于

    return new Promise(function(resolve){
        resolve(url);
    });
  2. 这个loadScript这个函数在后面还挂了个then方法的对吧?url在这里可以理解为向后面的then传递参数。

至于你的第三个问题,我来稍微梳理下这个函数的流程吧。
变量script表示当前页面是否已经加载了指定的脚本。如果已经加载了,那么就会运行:

return Promise.resolve(url);//这个在上面已经提过了,它等同于return new Promise(function(resolve){
    resolve(url);
})

事实上,返回的这个Promise就是个空的,它马上执行了resolve函数把值传递了下去。

如果指定脚本并没有加载,那么就会执行你的第②部分。
这部分将会加载指定的脚本,然后等待脚本加载完成,或者是加载出错。
然后就到了你的疑问,如何判断啥时候加载完成,啥时候出错呢?

答案是你的这两句话:

script.addEventListener('load',  function() { resolve(url); }, false);
script.addEventListener('error', function() { reject(url); }, false);

这里给脚本绑定了loaderror事件,两个事件中的回调函数分别表示了这个脚本在未来的两种可能性。
用个不太恰当的比喻,resolvereject两个函数就好像promise的开关,执行这两个函数就表示当前promise的动作执行完了,马上就会执行then绑定的下一个动作。


查看完整回答
反对 回复 2018-10-20
  • 1 回答
  • 0 关注
  • 600 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号