我正在重构一些使用async
/ await
的承诺代码,除了一件事情外,它的效果很好。
Promise
允许你做的事情就是在任何你想要的地方“注入”回调。例如:
public DoSomethingAsync() {
return new Promise<void>(done => {
// do some stuff
done();
});
}
甚至可能回调也包含在另一个回调中:
public DoSomethingAsync() {
return new Promise<void>(done => {
const somethingDeferred = GetSomethingDeferred();
somethingDeferred.onsuccess = () => {
// some success code
done();
};
});
}
“拒绝”处理程序存在类似的问题。
有没有办法将这些重构为async
/ await
?或者他们被困在new Promise...
区块?
我认为第一个例子可以简化为:
public async DoSomethingAsync() {
// do some stuff
}
因为无论如何都会自动调用回调。但第二个例子似乎更成问题。
答案 0 :(得分:3)
有没有办法将这些重构为
async
/await
?
没有
或者他们被困在
new Promise...
区块?
是。你需要promisify这些异步的函数,但是不使用new Promise
构造函数(或者可以缩短重复代码的辅助函数)返回一个promise,没有办法解决这个问题。你将第二个例子重写为
public async DoSomethingAsync() {
await new Promise<void>((resolve, reject) => {
const somethingDeferred = GetSomethingDeferred();
somethingDeferred.onsuccess = resolve;
somethingDeferred.onerror = reject;
});
// some success code
return …;
}
或者,使用帮助函数:
function toPromise(somethingDeferred) {
return new Promise<void>((resolve, reject) => {
somethingDeferred.onsuccess = resolve;
somethingDeferred.onerror = reject;
});
}
public async DoSomethingAsync() {
await toPromise(GetSomethingDeferred());
// some success code
return …;
}