【问题标题】:Return callback's result from a promise [duplicate]从承诺中返回回调的结果[重复]
【发布时间】:2018-06-15 18:23:17
【问题描述】:

我尝试在一个类中创建一个通用的request 方法。

它应该是向 API 发出请求、返回结果(以 XML 格式)、将结果解析为 JSON 以及处理错误处理的中心位置。

我使用node-xml2js 进行解析,这适用于回调。

我应该如何从回调中返回结果,以便在调用函数令牌后我可以使用 JSON ?

现在它返回一些奇怪的结果(可能是parser.parseString()

{
  comment: '',
  sgmlDecl: '',
  textNode: '',
  tagName: '',
  doctype: '',
  procInstName: '',
  procInstBody: '',
  entity: '',
  attribName: ''
}

代码如下:

class Foo {

  token(){
    // ...
    return this.request(uri, xml)
  }

  request(uri, xml) {
    // ...
    return rp.post(options).then(response=>{
      return parser.parseString(response.body, (err, result) => {
        // I can see the correct JSON result in the console
        console.log(JSON.stringify(result)) 
        return JSON.stringify(result)
      })
    }).catch(err=>{
      console.log(err)
    })
  }

}

// usage

const foo = new Foo()
foo.token().then(res => {
  console.log(res) // no result
})

【问题讨论】:

  • 你没有从承诺中返回,你在then做的事情。

标签: javascript node.js callback promise


【解决方案1】:

可以使用promise来实现。通过promise chaining,可以解决。

request = (uri, xml) => {

      return new Promise((resolve, reject) => {

        rp
          .post(options)
          .then(response => {
            return parser.parseString(response.body, (err, result) => {

              resolve(JSON.stringify(result))
            })
          })
          .catch(err => {
            reject(err)
          })

      });
    }

【讨论】:

  • 承诺链是明智的。然而,这是nested promises antipattern 的一个示例
  • @Quentin 甚至它的反模式,但仍然使用链接实现
  • @Quentin 你能告诉我们你的建议吗?谢谢
  • @user3568719 — 有一个非常好的重复问题解释了如何使用回调。
  • @RIYAJKHAN — 不,不是。如果您当时正在链接,request 将返回由最后一个 then 函数返回的承诺,而不是立即在 request 内部创建的承诺,该承诺由传递给其中的 then 的函数解析。
猜你喜欢
  • 2018-05-21
  • 2021-11-01
  • 2019-02-06
  • 2016-06-15
  • 2014-05-07
  • 2021-07-22
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多