异步回调、错误与释放
13.1 Promise 与回调
推荐 await 服务方法,并捕获 SDKError。回调方式如下:
search.search('酒店',(status,result) => {
if(status === 'complete') console.log(result.poiList.pois);
else if(status === 'no_data') console.log('暂无结果');
else console.error(result); // 字符串错误码,不是完整 SDKError
}).catch(error => console.error(error.code,error.requestId));
服务同时返回 Promise,即便使用回调也应处理拒绝。cancel/destroy 的旧请求不应继续更新已销毁页面;不要依赖取消操作必然回调一次 error。异步结果写入 UI 前检查当前业务会话。
13.2 错误与日志
| 错误 / 字段 | 含义 |
|---|---|
| VERSION_MISMATCH | config.version 与当前脚本版本不一致 |
| UNSUPPORTED_PLUGIN / UNSUPPORTED_MODULE | 插件或模块未提供 |
| INVALID_ARGUMENT | 参数无效 |
| SDKError.code | 机器可读错误代码;服务可能返回更多代码 |
| SDKError.requestId | 服务诊断编号 |
| SDKError.httpStatus | HTTP 状态;无响应时为 0 |
| SDKError.retryAfterMillis | 可空;有效值用于限流后重试 |
sdk.setErrorLogger(record => console.warn(record));
// 不再需要日志代理时:sdk.setErrorLogger(null);
不要把表格当成完整的服务端错误枚举;定位与网络服务的错误来源不同。不要记录 Key 或用户完整敏感请求。有限重试时优先遵守 Retry-After,不无限自动循环。
13.3 页面释放顺序
先停止业务订阅、watchPosition、导航,再销毁搜索/路线/编辑器/信息窗,最后 map.destroy。每个独立实例由创建者持有并释放。clearMap() 清理覆盖物,不能代替独立定位和服务对象的 destroy。框架重复挂载先释放旧实例,避免重复地图和监听。