@@ -71,12 +71,14 @@ function Azure2DImageryProvider(options) {
7171 resource . setQueryParameters ( {
7272 "api-version" : "2024-04-01" ,
7373 tilesetId : options . tilesetId ,
74+ "subscription-key" : this . _subscriptionKey ,
7475 zoom : `{z}` ,
7576 x : `{x}` ,
7677 y : `{y}` ,
77- "subscription-key" : this . _subscriptionKey ,
7878 } ) ;
7979
80+ this . _resource = resource ;
81+
8082 let credit ;
8183 if ( defined ( options . credit ) ) {
8284 credit = options . credit ;
@@ -98,8 +100,6 @@ function Azure2DImageryProvider(options) {
98100 // This will be defined for ion resources
99101 this . _tileCredits = resource . credits ;
100102 this . _attributionsByLevel = undefined ;
101- // Asynchronously request and populate _attributionsByLevel
102- this . getViewportCredits ( ) ;
103103}
104104
105105Object . defineProperties ( Azure2DImageryProvider . prototype , {
@@ -300,7 +300,21 @@ Azure2DImageryProvider.prototype.requestImage = function (
300300 level ,
301301 request ,
302302) {
303- return this . _imageryProvider . requestImage ( x , y , level , request ) ;
303+ const promise = this . _imageryProvider . requestImage ( x , y , level , request ) ;
304+
305+ // If the requestImage call returns undefined, it couldn't be scheduled this frame. Make sure to return undefined so this can be handled upstream.
306+ if ( ! defined ( promise ) ) {
307+ return undefined ;
308+ }
309+
310+ // Asynchronously request and populate _attributionsByLevel if it hasn't been already. We do this here so that the promise can be properly awaited.
311+ if ( promise && ! defined ( this . _attributionsByLevel ) ) {
312+ return Promise . all ( [ promise , this . getViewportCredits ( ) ] ) . then (
313+ ( results ) => results [ 0 ] ,
314+ ) ;
315+ }
316+
317+ return promise ;
304318} ;
305319
306320/**
@@ -336,6 +350,7 @@ Azure2DImageryProvider.prototype.getViewportCredits = async function () {
336350 for ( let level = 0 ; level < maximumLevel + 1 ; level ++ ) {
337351 promises . push (
338352 fetchViewportAttribution (
353+ this . _resource ,
339354 this . _viewportUrl ,
340355 this . _subscriptionKey ,
341356 this . _tilesetId ,
@@ -361,19 +376,17 @@ Azure2DImageryProvider.prototype.getViewportCredits = async function () {
361376 return attributionsByLevel ;
362377} ;
363378
364- async function fetchViewportAttribution ( url , key , tilesetId , level ) {
365- const viewport = await Resource . fetch ( {
366- url : url ,
379+ async function fetchViewportAttribution ( resource , url , key , tilesetId , level ) {
380+ const viewportResource = resource . getDerivedResource ( {
381+ url,
367382 queryParameters : {
368- tilesetId,
369- "subscription-key" : key ,
370- "api-version" : "2024-04-01" ,
371383 zoom : level ,
372384 bounds : "-180,-90,180,90" ,
373385 } ,
374386 data : JSON . stringify ( Frozen . EMPTY_OBJECT ) ,
375387 } ) ;
376- const viewportJson = JSON . parse ( viewport ) ;
388+
389+ const viewportJson = await viewportResource . fetchJson ( ) ;
377390 return viewportJson . copyrights ;
378391}
379392
0 commit comments