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
实现承诺的包装器,但我的观点是,除了不返回最后一个值之外,原始代码似乎没有什么问题。如果你想让我删除这个,我会的。我想让你投票结束这个问题作为离题(不可复制),无论你是否删除你的答案是你的选择。