uni-app Promise.allSettled在ipad端无法使用

uni-app Promise.allSettled在ipad端无法使用

开发环境 版本号 项目创建方式
Windows 11 HBuilderX
### 操作步骤:

Promise.allSettled([ carRepertory({ days: this.days }) ]).then(res=>{ console.log(res,‘res’) }) `

1 回复

更多关于uni-app Promise.allSettled在ipad端无法使用的实战教程也可以访问 https://www.itying.com/category-93-b0.html


根据您提供的信息,Promise.allSettled 在 iPad 端无法使用,这通常是由于 iOS 系统版本或 WebView 内核版本过低导致的兼容性问题。

Promise.allSettled 是 ES2020 标准中新增的 API。在 uni-app 项目中,代码最终会在各端平台的 JavaScript 引擎中运行。在 iOS 端(包括 iPad),小程序和 App 的 JavaScript 运行环境有所不同:

  1. 小程序端:代码运行在各自小程序平台的 JavaScript 核心中(例如微信小程序的 JSCore)。这些环境对较新的 ES 标准支持可能滞后。
  2. App端(Vue 页面):在 iOS 上,页面渲染由系统 WebView(UIWebView/WKWebView)负责。Promise.allSettled 的可用性取决于 iOS 系统版本及其 WebView 内核的 JavaScript 引擎对 ES2020 的支持程度。

根本原因Promise.allSettled 是一个相对较新的 API。在 iOS 12 及更低版本的系统 WebView 中,或一些较旧版本的小程序运行环境中,可能并未实现此 API,导致调用时出现 undefined is not a function 或类似错误。

解决方案

方案一:添加 Polyfill(推荐,一劳永逸) 在项目入口文件(如 main.js)或具体使用该 API 的页面/组件中,引入 Promise.allSettled 的 Polyfill 实现。这样可以在原生不支持的环境下自动提供兼容实现。

// 在主入口 main.js 中添加
if (!Promise.allSettled) {
  Promise.allSettled = function (promises) {
    return Promise.all(promises.map(p => 
      Promise.resolve(p).then(
        value => ({ status: 'fulfilled', value }),
        reason => ({ status: 'rejected', reason })
      )
    ));
  };
}

或者,使用社区成熟的 polyfill 库(如 core-js),但需要注意控制包体积。

方案二:降级使用 Promise.all 如果您的逻辑可以接受,可以使用 Promise.all 配合 catch 进行降级处理,但这会改变错误处理方式(Promise.all 会在任何一个 Promise 失败时立即拒绝)。

// 原有的 allSettled 逻辑可能需要调整
Promise.all([
  carRepertory({ days: this.days }).catch(e => e) // 将错误转换为正常值
]).then(res => {
  console.log(res, 'res');
});

方案三:检查并提示系统升级 如果您的应用仅支持较高版本的 iOS,可以在应用启动时检查 API 可用性,并对不支持的设备给出友好提示。

// 在 App.vue 的 onLaunch 中检查
if (typeof Promise.allSettled === 'undefined') {
  // 给出提示或使用 polyfill
  console.warn('当前环境不支持 Promise.allSettled,将自动兼容');
  // 动态加载 polyfill 或引导用户升级系统
}
回到顶部