Javascript 承诺解析用作函数?

Javascript 承诺解析用作函数?,javascript,google-maps,ecmascript-6,promise,Javascript,Google Maps,Ecmascript 6,Promise,我最近一直在用Javascript处理承诺,但我很难理解这里到底发生了什么 正在使用initMap的回调设置Google地图脚本url。因此,当谷歌地图完成加载时,将触发此回调 它依次调用resolveFunc()resolvefunc()是在承诺范围内设置的,但我没有得到这部分: resolveFunc = resolve; 将其设置为解析函数有什么用 <script> var resolveFunc = null; var promise = new Promise(f

我最近一直在用Javascript处理承诺,但我很难理解这里到底发生了什么

正在使用
initMap
的回调设置Google地图脚本url。因此,当谷歌地图完成加载时,将触发此回调

它依次调用
resolveFunc()
resolvefunc()
是在承诺范围内设置的,但我没有得到这部分:

resolveFunc = resolve;
将其设置为解析函数有什么用

<script>
  var resolveFunc = null;
  var promise = new Promise(function(resolve, reject) {
    resolveFunc = resolve;
  });
  promise.then(function() {
    console.log('loaded');
  });
  function initMap() {
    resolveFunc();
  }
</script>

<script src="https://maps.googleapis.com/maps/api/js?callback=initMap" async defer></script>

var resolveFunc=null;
var承诺=新承诺(功能(解决、拒绝){
resolveFunc=解析;
});
promise.then(函数(){
console.log('loaded');
});
函数initMap(){
resolveFunc();
}

我看到这种构造的唯一原因是,您希望能够访问在加载google maps api时解析的承诺

  • 将创建一个新的promise对象
  • 该承诺的resolve函数被分配到窗口变量
    resolveFunc
  • 一个
    。然后将
    分配给承诺,当承诺解析时,该承诺将发出控制台日志
  • 当外部gmaps脚本运行initMap函数时,将调用分配的resolve函数
  • 控制台中的
    日志
    。然后将触发

  • 我看不出在initMap中运行代码而不使用promise构造也可以实现任何这方面的需要。

    我以前从未见过这种构造

    我只能想到一个原因:允许某种模块化。谷歌地图URL的加载将触发这一承诺的解决。同时,其他模块可能已附加了
    。然后
    此承诺,将在加载此脚本时运行

    这个全局
    promise
    变量确实很难看,但它可以用于此目的


    注意:我指的是一般意义上的“模块”:一些合理独立、内聚的代码块。

    此模式背后的思想是脚本,它加载了:

    src="https://maps.googleapis.com/maps/api/js?callback=initMap"
    
    …应该能够解决承诺。为此,脚本需要调用promise构造函数提供的
    resolve
    函数。但由于
    resolve
    是该构造函数的局部变量,作者使用了一种解决方案,将该函数分配给一个全局变量,该变量将可用于加载的脚本

    该脚本肯定会查看url中存在的
    回调
    参数,并提取其后面的值。它将被分配给某个变量,比如说
    callback
    ,然后它们将通过以下方式触发解析:

    window[callback]();
    
    它将是
    resolveFunc
    的同义词,而
    resolve
    又是同义词

    该脚本不可能通过调用
    resolve

    resolve();
    

    。。。因为这将是一个未知的变量。

    这种方法被称为延迟模式,特别是。这很容易,但在这里可能是合理的,因为这是从GoogleMapsAPI回调转变为承诺的合理方式

    promise
    解析延迟到调用
    resolveFunc
    回调
    promise
    是全局的,可以在应用程序内部使用。如果未使用,出于上述原因,可以将其视为反模式:

    当您不真正理解承诺并将其视为美化的事件发射器或回调实用程序时,很容易陷入这种情况

    可能只是:

    <script>
      function initMap() {
        console.log('loaded');
      }
    </script>
    
    
    函数initMap(){
    console.log('loaded');
    }
    
    也许更好理解:
    var-promise=new-promise(resolve=>{window.initMap=resolve;})
    您了解JSONP是如何工作的吗?是的,我了解了在查看完所有内容并在这里的注释的帮助下现在发生了什么。哦,现在我明白了,它被分配给了resolve函数,但直到
    resolveFunc()它才被执行之所以调用
    ,是因为它实际上指的是
    resolve
    函数。Bergi的评论显示了实现同样目标的更好方法。但主要的一点是,这个承诺是通过JSONP回调来解决的。如果我是对的,那么这样做的原因就是让这个承诺暴露在额外的回调中。