【问题标题】:Type 'void' must have a '[Symbol.iterator]()' method that returns an iterator [duplicate]类型“void”必须有一个返回迭代器的“[Symbol.iterator]()”方法[重复]
【发布时间】:2019-10-07 01:34:16
【问题描述】:

当我运行下面的post() 函数时,我收到以下错误信息:

Type 'void' must have a '[Symbol.iterator]()' method that returns an iterator. 

这是我要运行的内容:

  static async post(options:object) {
    const promise = postRequest(options)
    const [err, data] = await this.promiseWapper(promise);
    return [err, data]
  }

  static async promiseWapper(promise: any) {
    return
    promise()
      .then((res: any) => [undefined, res])
      .catch((err: any) => [err, undefined])
  }

我怎样才能让这段代码正常运行?

【问题讨论】:

  • 这还不够详细,无法提供有意义的帮助。 “postRequest”有什么作用?
  • promiseWrapper 被标记为async 但它不是await 任何东西。你的意思是await 是你返回的那个承诺的结果吗?或者也许只是删除 async 关键字?
  • @StriplingWarrior 虽然这是真的,但这不一定是问题 - 如果异步函数返回 Promise,它们的行为相同。任何返回承诺但未标记为异步的函数,如果将其标记为异步,则其行为实际上是相同的
  • @TKoL:所以 JavaScript 会检测到你最终会得到一个 Promise 的 Promise 并解开它(或者可能只是一开始就避免包装它)?这就说得通了。它与.then() 的工作方式相得益彰。我习惯于从 C# 中异步/等待,您必须更明确地了解这些内容。
  • 你的代码有多个问题:promise 不应该作为函数调用,它应该有类型 Promise<any> not any,你不是 returning 来自 promiseWrapper 的任何东西(由于ASI)所以它会有一个Promise<void>返回类型,你应该在你的函数中添加返回类型而不是依赖类型推断,你的promiseWrapper使用.then()/.catch()风格不应该是async

标签: javascript typescript


【解决方案1】:

我修复了你的代码。 PromiseWrapper 将 Promise 称为 FUNCTION,promise(),但它不是一个函数,而是一个 Promise。假设postRequest 返回一个promise,那就是……

  async function post(options) {
    const promise = postRequest(options)
    const [err, data] = await this.promiseWapper(promise);
    return [err, data]
  }

  async function promiseWapper(promise) {
    return promise
      .then((res) => [undefined, res])
      .catch((err) => [err, undefined])
  }

  function postRequest() {
    return Promise.resolve(true);
  }

  post();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-19
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多