2021年7月2日星期五

JS里的异步实例化

JS里的异步构造函数

众所周知,Js的构造函数是不能加上async/await来实现异步实例化的,一般当需要一个对象的属性是异步的结果时可以这样写:

//! 一个需要指定时间后返回的异步函数function delay(timeout) { return new Promise((resolve) => setTimeout(() => resolve("end"), timeout));}class Test { async init() {  this.end = await delay(1000); }}(async function () { const test = new Test(); //? 实例化 await test.init(); //? 初始化end属性 console.log(test.end);})();

但是当我想要在实例化时就调用该属性时就还要调用一次init(),这未免太麻烦了,所以想要在实例化时就把该属性赋值,就像这样const test = await new Test()

这时找到了这篇文章,该作者提供了这样一段代码来实现了异步构造函数:

class MyClass { constructor(timeout) { this.completed = false const init = (async () => {  await delay(timeout)  this.completed = true  delete this.then  return this })() this.then = init.then.bind(init) }}(async function(){ const myclass = await new MyClass(1000);})()

在解释这段代码前就得说说PromiseLike了:一个有then方法,且该方法接收resolve,reject两个参数的对象,就像这样:

const PromiseLike = { then(resolve) {  resolve("i am PromiseLike"); },};(async function () { const something = await PromiseLike; console.log(something); // i am PromiseLike})();

即使PromiseLike不是一个函数,它也会被await调用对象里的then方法并resolve出结果

现在回到刚才那段代码,注意到它最后的一段了吗

this.then = init.then.bind(init)

这句话把一个异步函数initthen给了实例,所以在调用new Myclass 后得到的实例上有着一个then方法,这个then方法又会被前面的await解析,这时实质上解析的就是init这个异步函数的then而这个then返回的是该类的实例化删除then后的this

这样await new MyClass()会等到init的异步执行完毕才会返回值,这个返回值是init的resolve。

总结一下:该方法其实仍然是同步实例化出了对象,但是<......

原文转载:http://www.shaoqun.com/a/841207.html

跨境电商:https://www.ikjzd.com/

吴佳:https://www.ikjzd.com/w/1770

中国邮政邮乐网:https://www.ikjzd.com/w/1776

google correlate:https://www.ikjzd.com/w/1887


JS里的异步构造函数众所周知,Js的构造函数是不能加上async/await来实现异步实例化的,一般当需要一个对象的属性是异步的结果时可以这样写://!一个需要指定时间后返回的异步函数functiondelay(timeout){returnnewPromise((resolve)=>setTimeout(()=>resolve("end"),timeout));}
weebly:https://www.ikjzd.com/w/2486
关于亚马逊广告运营,这三个层面的思考必不可少!:https://www.ikjzd.com/articles/112180
"价格战"一触即发,亚马逊最新改革被喷"变态"!:https://www.ikjzd.com/articles/112181
亚马逊反馈请求政策有什么变化?具体规则是什么?:https://www.ikjzd.com/articles/112182
wish潜力产品合集,圣诞爆单你准备好了吗?:https://www.ikjzd.com/articles/112183
他扒开我的下面舌头伸进去 吃她两腿中间的小豆豆:http://lady.shaoqun.com/a/247454.html
我解开了岳的乳 岳好紧好紧我要进去了:http://lady.shaoqun.com/m/a/247389.html
男人爱㖭女人下边 被㖭下面是什么感觉:http://www.30bags.com/m/a/249751.html
在武汉呆了50天,发现老公用了一袋草莓,把邻居哄睡着了!:http://lady.shaoqun.com/a/397666.html
23岁的男孩一大早就对着女邻居破口大骂:"小电影"让我欲火焚身:http://lady.shaoqun.com/a/397667.html
TikTok打开跨境卖家流量的新大门!:https://www.ikjzd.com/articles/146283
亚马逊和沃尔玛都瞄准的服饰赛道,欧美人表示:愿意买单!:https://www.ikjzd.com/articles/146275

没有评论:

发表评论