CNode

有个关于异步的问题请教一下

问答
BBryanChiao发布于8 年前最后回复8 年前5 回复2666 浏览0 收藏

代码:

// create.ts
export function create() {
  return new Promise((res, rej) => {
    setTimeout(() => {
      console.log('create');
      res('123');
    }, 3000);
  });
}

// getInstance.ts
let instance = null;
export async function getInstance() {
  if (!instance) {
    instance = await create();
  }
  return instance;
}

// test.ts
async function one() {
  const o = await getInstance();
  console.log(o);
}

async function two() {
  const t = await getInstance();
  console.log(t);
}

one();
two();

执行结果如下

create
create
123
123

请教一下如何修改getInstance.ts才能让create只执行一遍

查看回复

回复 (5)

B
BryanChiao#1·8 年前
引用 huhu2356直接return singleton promise

@huhu2356 问题解决了 谢谢

D
dingyuanwu#2·8 年前

执行one()、two()之间是异步的,两个方法都会在instance = await create();的时候阻塞,可是这时getInstance()方法已被调用,所以create()会执行两次 one()、two()是async函数,执行的时候使用await就可以了

B
BryanChiao#3·8 年前
引用 dingyuanwu执行one()、two()之间是异步的,两个方法都会在instance = await create();的时候阻塞,可是这时getInstance()方法已被调用,所以create()会执行...

@dingyuanwu 这边为了测试才用的one two 实际上是在两个不同地方用了await getInstance() 所以在考虑能不能通过修改instance.ts实现

A
alexlees#4·8 年前

@BryanChiao 你需要了解的是单例模式,而不是异步。

来自MaterialCNode

H
huhu2356#5·8 年前

直接return singleton promise

// getInstance.ts
let instance = null;
export async function getInstance() {
  if (!instance) {
    instance = create();
  }
  return instance;
}
参与回复
登录后即可参与回复。登录