• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

基础[javascript] TC39 withResolvers新特性

武飞扬头像
反者道之动_弱者道之用
帮助1

这个特性是对我们当前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
系列文章
更多 icon
同类精品
更多 icon
继续加载