Javascript 承诺解析用作函数?
我最近一直在用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
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时解析的承诺
resolveFunc
。然后将
分配给承诺,当承诺解析时,该承诺将发出控制台日志控制台中的日志。然后将触发
我看不出在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回调来解决的。如果我是对的,那么这样做的原因就是让这个承诺暴露在额外的回调中。