【发布时间】:2019-06-30 11:05:51
【问题描述】:
我想在我的类方法中使用 Promises。在Promise antipatterns 中,我读到为每个新功能创建一个新的承诺被认为是不好的。
但是,我不想在我的项目中返回不相关的承诺,所以我想做这样的事情:
class MyClass {
async getToken() {
return new Promise(
(resolve, reject) => {
// . . .
const token_str = '<response_from_http_request>';
resolve(token_str);
}
)
}
async doSomething(token) {
return new Promise(
(resolve, reject) => {
const result = // . . .
resolve(result);
}
)
}
async doAnotherSomething(token) {
return new Promise(
(resolve, reject) => {
const result = // . . .
resolve(result);
}
)
}
}
然后我会这样使用它:
let instance = new MyClass();
(async () => {
const token = await instance.getToken();
const result1 = await instance.doSomething(token);
console.log(result1);
const result2 = await instance.doAnotherSomething(token);
console.log(result2);
})();
这似乎是一种有效的方法,或者这也是一种反模式?如果是这样,我怎样才能避免编写这样的代码?
编辑:如果我需要进行多次连续的 http 调用,对结果执行一些操作,然后基于它返回一个 Promise?
按照我的理解,如果我不做出新的承诺,我必须返回got.js库做出的承诺,其中包括http响应数据。
相反,我想返回一个包含我的类方法结果的 Promise。
例子: async getCityWeather( city_name ) {
return new Promise(
(resolve, reject) => {
// get the city id based on its name
const city_id = await got(`https://my-api/getCityIdByName/${city_name}`);
// now get the weather info for the city with id `cityid`
const weather_info = await got(`https://my-api/weatherById/${city_id}`);
// make an object to return
const temperature = {
weather_info.temp_min,
weather_info.temp_max,
}
resolve(temperature);
// ... all error handling are omitted
}
)
}
我不想返回包含 got.js 返回值的 Promise,我想根据 http 请求调用返回 my 值。
【问题讨论】:
-
// . . .到底是什么?除非你在那里做任何异步操作,否则你根本不应该使用 Promise。 -
旁注:您的
result1和result2仅依赖于令牌。然后你可以这样做:const [result1, result2] = await Promise.all([instance.doSomething(token), instance.doAnotherSomething(token)]);不会导致阻塞。 -
@k0pernikus 两种方式都不会导致阻塞,因为它会阻塞线程。他们是浪费的,因为一个人需要等待另一个人。
-
@Bergi 我忘了说,在所有
// . . .标记的行中,我正在做异步got.js 调用。 -
@k0pernikus 很好的观察!但是,如果另一个变量失败,这不是无法填充
result*变量吗?至少这是我从Promise.all()了解到的。无论如何,正如@Nik 所说,在调用独立的情况下使用await是一种浪费。
标签: javascript node.js promise async-await