You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从异步函数返回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:23:24