同步调用JavaScriptclass方法
Call JavaScript class method synchronously
我正在用 JavaScript 构建一个包,它有两个功能:init
和 sendData
。
class Client {
init() {
return axios.post(this.baseUrl).then((response) => {
this.token = response.data.token
})
}
sendData() {
return axios.post(this.baseUrl, {token: this.token})
}
}
需要在 sendData
方法之前调用 init
方法,因为此 returns 是一个标记。有没有办法在调用sendData
方法之前等待init方法被调用?
您需要 API 的消费者来执行此操作吗?
// within an async function
const client = new Client();
await client.init();
await client.sendDate();
// or anywhere just using promises
const client = new Client();
client.init().then(() => client.sendDate());
还是 API 本身?
// definition
class Client {
async init() {
const response = await axios.post(this.baseUrl);
this.token = response.data.token;
}
async sendData() {
await this.init(); // call init before sending data
return axios.post(this.baseUrl, {token: this.token})
}
}
// usage somewhere in an async function
const client = new Client();
client.sendDate() // calls init, then sends the data
如果令牌不变,是否可以删除冗余调用?
class Client {
async init() {
const response = await axios.post(this.baseUrl);
this.token = response.data.token;
}
async sendData() {
if (!this.token) { // now you'll only call init for missing token
await this.init();
}
return axios.post(this.baseUrl, {token: this.token})
}
}
// usage somewhere in an async function
const client = new Client();
await client.sendDate(); // calls init (only the first time), then sends the data
请注意,promise 返回函数本质上是异步的,因此无法以同步方式获取它们的结果。但是,我们可以使用 async/await 编写异步代码,使其在语法上看起来(几乎)与同步版本相同。
异步初始化是工厂模式的一个很好的用例。不要在构造 class 之后进行异步工作,而是在之前进行并保持构造函数同步。在我看来,做简单赋值的同步构造函数最少 "smell" 并且最容易测试。
class Client {
constructor(baseUrl, token) {
this.baseUrl = baseUrl;
this.token = token;
}
async create(baseUrl) {
const response = await axios.post(baseUrl);
return new Client(baseUrl, response.data.token);
}
async sendData() {
return axios.post(this.baseUrl, {token: this.token})
}
}
...
const client = await Client.create('http://foo.com');
const response = await client.sendData();
我正在用 JavaScript 构建一个包,它有两个功能:init
和 sendData
。
class Client {
init() {
return axios.post(this.baseUrl).then((response) => {
this.token = response.data.token
})
}
sendData() {
return axios.post(this.baseUrl, {token: this.token})
}
}
需要在 sendData
方法之前调用 init
方法,因为此 returns 是一个标记。有没有办法在调用sendData
方法之前等待init方法被调用?
您需要 API 的消费者来执行此操作吗?
// within an async function
const client = new Client();
await client.init();
await client.sendDate();
// or anywhere just using promises
const client = new Client();
client.init().then(() => client.sendDate());
还是 API 本身?
// definition
class Client {
async init() {
const response = await axios.post(this.baseUrl);
this.token = response.data.token;
}
async sendData() {
await this.init(); // call init before sending data
return axios.post(this.baseUrl, {token: this.token})
}
}
// usage somewhere in an async function
const client = new Client();
client.sendDate() // calls init, then sends the data
如果令牌不变,是否可以删除冗余调用?
class Client {
async init() {
const response = await axios.post(this.baseUrl);
this.token = response.data.token;
}
async sendData() {
if (!this.token) { // now you'll only call init for missing token
await this.init();
}
return axios.post(this.baseUrl, {token: this.token})
}
}
// usage somewhere in an async function
const client = new Client();
await client.sendDate(); // calls init (only the first time), then sends the data
请注意,promise 返回函数本质上是异步的,因此无法以同步方式获取它们的结果。但是,我们可以使用 async/await 编写异步代码,使其在语法上看起来(几乎)与同步版本相同。
异步初始化是工厂模式的一个很好的用例。不要在构造 class 之后进行异步工作,而是在之前进行并保持构造函数同步。在我看来,做简单赋值的同步构造函数最少 "smell" 并且最容易测试。
class Client {
constructor(baseUrl, token) {
this.baseUrl = baseUrl;
this.token = token;
}
async create(baseUrl) {
const response = await axios.post(baseUrl);
return new Client(baseUrl, response.data.token);
}
async sendData() {
return axios.post(this.baseUrl, {token: this.token})
}
}
...
const client = await Client.create('http://foo.com');
const response = await client.sendData();