闽公网安备 35020302035485号
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.withResolverslet num = true; const { promise, resolve, reject } = Promise.withResolvers(); num ? resolve("ok") : reject("not ok");
通过上述步骤配置 Babel 和 webpack,你的项目就可以安全地使用 Promise.withResolvers,同时保证在老版本浏览器上的兼容性。主要是通过 @babel/preset-env 和 core-js 自动管理 polyfill,这样可以极大简化项目配置和维护工作。