【问题标题】:ES6 Can't return a new Promise after current Promise finished当前 Promise 完成后 ES6 无法返回新的 Promise
【发布时间】:2016-01-08 12:52:46
【问题描述】:

我需要以某种方式链接 Promise,然后我发现 Promise 可以完成这项工作。

我的要求是这样的: addressService.get 返回一个地址,一旦我得到这个地址并使用它进行另一个调用,它也返回一个 Promise。

所以我的代码是这样的:

class PersonService {
  getPerson() {
    addressService.get().then(({address}) => {
      return 'http://localhost/${address}'
    }).then(url) {
      return new es6Promise.Promise(function(resolve, reject) {
        ApiUtils.get(url, {}, {}, {
          success: resolve, error: reject
        });
      });
    }
  }
}

PersonService's getPerson 也应该返回一个 Promise,这是我返回的第二个 Promise (ApiUtils.get)

但是,上面的代码似乎没有返回 Promise,因为当我在其他地方调用 PersonService.getPerson().then() 时,我得到了一个错误提示

Uncaught TypeError: Cannot read property 'then' of undefined 

我错过了什么吗?

【问题讨论】:

  • 你在.then(url) {这行有语法错误并且get()没有返回返回的promise,请添加addressService.get的代码
  • 那些真的是反引号,因为它们看起来像单引号。

标签: javascript ecmascript-6 es6-promise


【解决方案1】:

那是因为getPerson() 什么都不返回。您缺少 return 关键字。

正确的结构是:

getPerson() {
 return addressService.get()
                      .then(...)
                      .then(...);
}

旁注:还有其他几个拼写错误/小错误需要修复:

class PersonService {
  getPerson() {
    return addressService.get().then(({address}) => { // <== Added return at beginning of line
      return `http://localhost/${address}`;           // <== Use ` (backtick), not ', for template strings
    }).then(url => {                                  // <== Fixed typo
      return new es6Promise.Promise(function(resolve, reject) {
        ApiUtils.get(url, {}, {}, {
          success: resolve, error: reject
        });
      });
    });                                               // <== Fixed typo
  }
}

【讨论】:

  • 就个人而言,我赞成让工具(编译器、解释器、REPL、调试器)而不是人类来查找错别字。它更容易和更快,您不必等待 SO 上的人回复。实际上,这整个问题是关于一堆错别字,如果你把 return 作为一种特殊的错别字排除在外,那么这个问题应该作为错别字结束。
  • @torazaburo 我不太同意。主要错误是我在使用其他拼写错误编辑帖子之前的唯一答案,即 OP 无法理解 .then() 返回一个 Promise 本身,应该由 getPerson() 返回。实际上问题是:“如何返回内部承诺”,这不是一个好主意,也是对 Promises 工作原理的误解。这不是错字。这是有效的 JS,虽然不工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-15
  • 2021-03-28
  • 2018-03-12
  • 2018-07-04
  • 2019-05-28
  • 2023-03-09
相关资源
最近更新 更多