【问题标题】:Angular2 HTTP POST using observables subscribe shows data as 'undefined'Angular2 HTTP POST 使用 observables 订阅将数据显示为“未定义”
【发布时间】:2017-10-06 05:13:59
【问题描述】:

我使用 Angular 2 将数据发布到返回 XML 响应的 URL,我想将数据转换为 JSON,所以我使用 xml2js

转换进行得很好,但我在“订阅”块中得到未定义的“数据”。如果我在拧,请纠正我,我猜因为 xml2js 是一个异步操作,“数据”是未定义的。那么我该如何处理这种承诺的承诺情况并正确返回转换后的 JSON 数据呢? 代码如下:

 this.http.post(this._yourUrl, formdata.toString(), options)
 .map(res => {
        xml2js.parseString( res.text(), function (err, result) {
        console.dir(result); // Prints JSON object!
        return result;
     });
 })
 .subscribe(data => { 
      console.log(data);              
 });

非常感谢任何帮助。谢谢!

【问题讨论】:

  • 尝试添加返回 return xml2js.parseString... 或从 map lambda 方法中删除大括号
  • CriPstian,我已经尝试向 xml2js.parseString 添加返回,它返回一个 SAXParser 对象。删除大括号会导致编译错误。

标签: json angular promise xml2js


【解决方案1】:

假设xml2js.parseString是一个同步操作,

试试这个:

this.http.post(this._yourUrl, formdata.toString(), options)
 .map(res => {
        var myRes;
        xml2js.parseString( res.text(), function (err, result) {
            console.dir(result); // Prints JSON object!
            myRes = result;
        });
        return myRes;
 })
 .subscribe(data => { 
      console.log(data);              
 });

【讨论】:

  • echonax,成功了!谢谢 :) 如果您不介意,请给我一个与此相关的链接,以便我了解它是如何工作的。
  • @Malick 在库回调中返回结果可能很棘手。我假设这个库在其本机代码中使用了类似流的东西或像forEach 这样的牢不可破的循环,所以它没有返回任何东西。因此,返回 parseString 之外的值应该可以解决问题。检查这个想法:stackoverflow.com/questions/34653612/…
  • 好的。会检查的。再次感谢!
  • 明白了,不过还有一个疑问,希望你不要介意。 xml2js.parseString 是如何进行同步操作的?这不是异步操作吗?并且在异步调用完成之前不会运行'return myRes'语句,在这种情况下,如何在分配'myRes = result'之后再次调用'return'调用?
  • @Malick 很好,如果上面的代码有效,那就是同步操作。喜欢JSON.parse(obj)
猜你喜欢
  • 2016-09-20
  • 2018-02-27
  • 2016-04-27
  • 2018-06-02
  • 2018-08-30
  • 1970-01-01
  • 2018-07-12
  • 2016-11-17
  • 1970-01-01
相关资源
最近更新 更多