从异步函数返回MapView实例或传入Promise解析器引发无限Promise链问题
解决ArcGIS JS API中[esri.core.Promise] DEPRECATED: then()警告问题
这个警告我之前也碰到过,本质是ArcGIS JS API的自定义Promise实现和原生JavaScript Promise机制的冲突导致的:MapView(以及API里很多核心类)本身继承自esri/core/Promise,这个自定义Promise的then()方法已被官方标记为弃用,推荐用.when(callback, errback)替代。而当你在async函数中直接返回MapView实例,或者用Promise.resolve(mapViewInstance)包装它时,原生JS的Promise处理逻辑会自动调用这个已弃用的then()方法,从而触发大量警告日志。
解决方案:用view.when()转换为原生Promise
官方推荐的做法是利用MapView的.when()方法来处理实例就绪状态,同时规避弃用警告。.when()会返回标准的原生Promise,完全兼容原生JS的Promise逻辑。
修改后的async函数示例:
async function test() { const view = new MapView({ container: "map", map: new Map({ basemap: "satellite" }), zoom: 2 }); // 等待视图初始化完成,同时将ArcGIS自定义Promise转换为原生Promise await view.when(); // 此时返回view不会触发弃用警告 return view; }
针对Promise.resolve(mapViewInstance)的场景:
不要直接将MapView实例传入Promise.resolve(),而是先通过.when()获取原生Promise:
// 错误写法(会触发警告) // Promise.resolve(mapViewInstance).then(...) // 正确写法 mapViewInstance.when().then(view => { // 在这里处理已就绪的view实例 });
为什么这个方法有效?
.when()是ArcGIS JS API官方指定的then()替代方法,专门用于处理异步操作的完成/错误回调。.when()返回的是原生ECMAScript Promise,而非ArcGIS自定义的esri/core/Promise,因此后续的Promise链式调用(包括async函数的返回逻辑)会使用原生的then()方法,不会触发弃用警告。- 额外好处:等待
view.when()完成后,视图已经初始化就绪,还能避免后续操作中可能出现的未就绪状态问题。
内容的提问来源于stack exchange,提问作者Ettapp
相关产品推荐
相关产品推荐

