基础[javascript] TC39 withResolvers新特性
这个特性是对我们当前new Promise的一个简化写法,将原先的回调式转化为了通过返回响应的钩子函数实现实现相同的功能,
根据第三阶段提案的介绍,一些JavaScript开发者经常会自己将promise函数进行一次封装,并实现与该特性一样的效果(那它应该算是Promise最佳实践了吧)?
未使用with resolver方式封装的代码组织,依然采用回调式编程方法
const promise = new Promise((resolve, reject) => {
asyncRequest(config, response => {
const buffer = [];
response.on('data', data => buffer.push(data));
response.on('end', () => resolve(buffer));
response.on('error', reason => reject(reason));
});
});
利用引用将res和rej映射到外部,这也算的上一种闭包了
let resolve, reject;
const promise = new Promise((res, rej) => {
resolve = res;
reject = rej;
});
asyncRequest(config, response => {
const buffer = [];
response.on('callback-request', id => {
promise.then(data => callback(id, data));
});
response.on('data', data => buffer.push(data));
response.on('end', () => resolve(buffer));
response.on('error', reason => reject(reason));
});
我们可见,上述代码的组织逻辑从原先的回调嵌套转化为了顺序执行,同时保留了promise的能力
针对resolve和reject会传递数据到下层调用,所以出现了以下的代码调用书写方式
let resolve = () => { };
let reject = () => { };
function request(type, message) {
if (socket) {
const promise = new Promise((res, rej) => {
resolve = res;
reject = rej;
});
socket.emit(type, message);
return promise;
}
return Promise.reject(new Error('Socket unavailable'));
}
socket.on('response', response => {
if (response.status === 200) {
resolve(response);
}
else {
reject(new Error(response));
}
});
socket.on('error', err => {
reject(err);
});
这个方式看起来并不复杂,仅仅是在定义调用的时候向回调函数设置参数
接下来就是withResolvers函数的真正实现的调用方式了
const { promise, resolve, reject } = Promise.withResolvers();
根据TC39的提案仓库,我们可以找到实现该特性的polyfills代码,不难看出该代码的组织形式就是将上述的几个逻辑封装,并利用闭包向外传递函数的引用.
export function withResolvers() {
if (!this) throw new TypeError("Promise.withResolvers called on non-object")
const out = {}
out.promise = new this((resolve_, reject_) => {
out.resolve = resolve_
out.reject = reject_
})
return out
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgbakih
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01