Javascript 你的回报是什么?
我正在使用的是的一个修改版本,用于编写模糊Javascript 你的回报是什么?,javascript,typescript,promise,async-await,generator,Javascript,Typescript,Promise,Async Await,Generator,我正在使用的是的一个修改版本,用于编写模糊async/await语法的帮助程序。以下是TypeScript中的代码: export class Async { public static do(makeGenerator) { let generator = makeGenerator.apply(this, arguments); try { return handle(generator.next()); } catch (error) {
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);
});
这一切都很好
如果我尝试
返回Async.do(…)
,就会失败。通过检查代码,我认为这应该返回一个Promise
对象,但情况显然不是这样Async.do
立即返回,结果是undefined
。关于生成器的工作方式,我有什么遗漏吗?这对我来说很有用,尽管我重新编写了一点实用程序,以返回一个包装函数而不是IIFE:
函数等待(生成器){
返回函数asynced(){
等待功能(结果){
const promise=promise.resolve(result.value)
返回结果。完成?承诺:承诺。然后(
value=>waitived(iterator.next(value)),
error=>waitived(迭代器.throw(错误))
)
}
const iterator=generator.apply(这个,参数)
试一试{
等待返回(iterator.next())
}捕获(错误){
返回承诺。拒绝(错误)
}
}
}
班级计时器{
静态等待(毫秒){
返回新承诺(解析=>setTimeout(解析,毫秒))
}
}
等待(功能*(输入){
console.log('等待3秒')
产量计时器。等待(3000)
console.log('等待2秒')
产量计时器。等待(2000)
返回输入
})('test')。然后(value=>console.log(value))
我可以确认这是我代码中其他地方的一个问题(我错过了一个返回
的中间函数,该函数本应该返回承诺
)。等等,public
是一个有效的关键字,从什么时候开始?另外,我模糊地回忆起return
中的try/catch
并没有实际返回对象。尝试将其分配给一个变量,然后在Try/catch
blockSorry之外返回该变量!这是打字稿。我已经编辑过了。我会尝试一下“捉迷藏”的方法。我无法复制这个:我得到了一个承诺。你能提供一把小提琴来证明你得到了未定义的承诺吗?do
肯定会返回一个承诺,因为handle
和承诺。拒绝这两个承诺。但是,您传递给do
的函数没有返回任何内容,因此返回的承诺将解析为未定义的
。嗯,我似乎无法一蹴而就。我想这一定是其他代码出了问题。谢谢你的感官检查!这是一个很好的重写(除了滥用类
语法,只使用模块的静态成员),但我看不出这是如何回答这个问题的?@Bergi我从头重写了它,这样我就可以在不做任何假设的情况下跟踪OP代码中发生的事情。Timer
实际上并不是主代码的一部分,只是一个通过setTimeout
实现承诺的包装器,但我的观点是,除了不返回最后一个值之外,原始代码似乎没有什么问题。如果你想让我删除这个,我会的。我想让你投票结束这个问题作为离题(不可复制),无论你是否删除你的答案是你的选择。