Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Terrain Lockups in requestTileGeometry due to Promise Handling Inconsistencies #11630

Merged
Next Next commit
handle undefined/deferred return
  • Loading branch information
Marc E. Johnson committed Nov 14, 2023
commit 40cd32de7ccd2c001bbe18b535ede1edd77a22b4
26 changes: 22 additions & 4 deletions packages/engine/Source/Core/CesiumTerrainProvider.js
Original file line number Diff line number Diff line change
Expand Up @@ -897,11 +897,29 @@ CesiumTerrainProvider.prototype.requestTileGeometry = function (

if (!defined(layerToUse) && unknownAvailability) {
// Try again when availability data is ready– Otherwise the tile will be marked as failed and never re-requested
return availabilityPromise.then(() =>
this.requestTileGeometry(x, y, level, request)
);
return availabilityPromise.then(() => {
// handle promise or undefined return
return new Promise((resolve, reject) => {
// defer execution to the next event loop
setTimeout(() => {
const originalResult = this.requestTileGeometry(x, y, level, request);
if (originalResult && typeof originalResult.then === "function") {
originalResult
.then((result) => {
resolve(result);
})
.catch((err) => {
reject(err);
});
} else {
// undefined means deferred, wait for the promise to resolve
return resolve(this.requestTileGeometry(x, y, level, request));
}
}, 0); // next tick
marcejohnson marked this conversation as resolved.
Show resolved Hide resolved
});
});
}

// call overridden function below
return requestTileGeometry(this, x, y, level, layerToUse, request);
};

Expand Down