let resolve, reject; const promise = new Promise((res, rej) => { resolve = res; reject = rej; });Promise.withResolvers API 基础使用
function getUserInfo(userId) { return new Promise((resolve, reject) => { fetch(`https://api.****/users/${userId}`) .then(response => { if (response.ok) { return response.json(); } else { throw new Error('Failed to fetch user info'); } }) .then(data => resolve(data)) .catch(error => reject(error)); }); } // 堆代码 duidaima.com getUserInfo(1) .then(userInfo => { console.log('User info:', userInfo); // 更新 UI 或进一步处理 userInfo }) .catch(error => { console.error('An error occurred:', error); // 处理错误,比如显示错误消息 });使用 Promise.withResolvers 后,我们可以更优雅地实现相同的功能,减少了一些模板代码,并且使逻辑更加清晰:
function getUserInfo(userId) { const { promise, resolve, reject } = Promise.withResolvers(); fetch(`https://api.******/users/${userId}`) .then(response => { if (response.ok) { return response.json(); } else { throw new Error('Failed to fetch user info'); } }) .then(data => resolve(data)) .catch(error => reject(error)); return promise; } getUserInfo(1) .then(userInfo => { console.log('User info:', userInfo); // 更新 UI 或进一步处理 userInfo }) .catch(error => { console.error('An error occurred:', error); // 处理错误,比如显示错误消息 });在这个例子中,我们直接使用 Promise.withResolvers 来创建 Promise 和它的解决(resolve)与拒绝(reject)函数。这样一来,我们不再需要在 new Promise 的构造函数中手动包装 fetch 调用,而是可以直接在 fetch 的异步操作中调用 resolve 或 reject。这种方式不仅减少了代码的嵌套层次,也使得异步逻辑的控制更加直观和灵活。
.对于不支持该特性的环境,开发者需要考虑降级方案或者使用 Polyfill 来保证代码的兼容性。
npm install --save core-js npm install --save-dev @babel/core @babel/preset-env babel-loader步骤 2: 配置 Babel
module.exports = { presets: [ [ '@babel/preset-env', { useBuiltIns: 'usage', corejs: 3, // 指定使用 core-js 的版本 // 根据项目需要配置目标环境 targets: "> 0.25%, not dead", }, ], ], };这个配置告诉 Babel,根据你的代码实际使用情况(useBuiltIns: 'usage')和目标环境,自动引入所需的 core-js polyfills。这意味着,如果你的代码中使用了 Promise.withResolvers,相应的 polyfill 将被自动引入,无需手动导入。
module: { rules: [ { test: /\.js$/, exclude: /node_modules/, use: { loader: 'babel-loader', options: { presets: ['@babel/preset-env'] } } }, // 其他 loaders... ] }步骤 4: 使用 Promise.withResolvers
let num = true; const { promise, resolve, reject } = Promise.withResolvers(); num ? resolve("ok") : reject("not ok");通过上述步骤配置 Babel 和 webpack,你的项目就可以安全地使用 Promise.withResolvers,同时保证在老版本浏览器上的兼容性。主要是通过 @babel/preset-env 和 core-js 自动管理 polyfill,这样可以极大简化项目配置和维护工作。