我正在使用this example的修改版本来编写一个隐含async
/ await
语法的帮助器。这是TypeScript中的代码:
export class Async {
public static do(makeGenerator) {
let generator = makeGenerator.apply(this, arguments);
try {
return handle(generator.next());
} catch (error) {
return Promise.reject(error);
}
function handle(result) {
if (result.done) {
return Promise.resolve(result.value);
}
return Promise.resolve(result.value)
.then(nextResult => {
return handle(generator.next(nextResult));
})
.catch(error => {
return handle(generator.throw(error));
});
}
}
}
用法如下:
Async.do(function* () {
let someResult = yield somePromise();
// Don't continue until the promise resolves
someDependentOperation(someResult);
});
一切正常。
如果我尝试return Async.do(...)
,它会失败。我想检查代码应该返回一个Promise
对象,但显然并非如此。 Async.do
会立即返回,结果为undefined
。关于发电机的工作方式,我有什么遗漏吗?
答案 0 :(得分:0)
这对我有用,虽然我重写了一点实用程序来返回一个包装函数而不是一个IIFE:
function awaitify(generator) {
return function asynced() {
function awaited(result) {
const promise = Promise.resolve(result.value)
return result.done ? promise : promise.then(
value => awaited(iterator.next(value)),
error => awaited(iterator.throw(error))
)
}
const iterator = generator.apply(this, arguments)
try {
return awaited(iterator.next())
} catch (error) {
return Promise.reject(error)
}
}
}
class Timer {
static wait(ms) {
return new Promise(resolve => setTimeout(resolve, ms))
}
}
awaitify(function* (input) {
console.log('waiting 3 seconds')
yield Timer.wait(3000)
console.log('waiting 2 seconds')
yield Timer.wait(2000)
return input
})('test').then(value => console.log(value))
P.S。,删除'test'
以允许TypeScript运行此操作,因为asynced()
没有任何声明的arguments
。
答案 1 :(得分:0)
我可以确认这是我的代码中的其他地方的问题(我错过了return
我的一个应该返回Promise
的中间函数。