承诺生成器返回什么?

时间:2017-07-03 18:54:55

标签: javascript typescript promise async-await generator

我正在使用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。关于发电机的工作方式,我有什么遗漏吗?

2 个答案:

答案 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的中间函数。