2017-01-16 60 views
1

我创建这应该添加在数组/ JSON对象中的任何数字的承诺。JSON解析无极行为不正确

的add()应该采取的URL的字符串,并输出这些URL的总和。

的方式我已经做了如下:

我已经创建了一个名为解析的辅助函数,该函数在一个字符串(URL),并应输出的JSON对象位于网址。

我的问题是,在由$$$$表示的区域,对象jsonObject是正确解析的JSON对象。但是,在****表示的区域,紧接着我调用解析的地方之后,parsedObj不再是正确解析的JSON对象。例如,如果我解析一个包含[ 1, 2, 5, 4 ]的JSON对象,我将得到jsonObject = 1,2,5,4但是parsedObj = [object Promise]

为什么parsedObj是[object Promise]的数组而不是1,2,5,4

+0

你能提供一个小提琴吗? – Harper04

+0

@ Harper04对不起,这是什么? – chisquared

+1

可以请你在$$$$部分记录'url'参数吗?你确定返回的元素是一个字符串吗? – briosheje

回答

1

parse(url: string): any返回无极不是你的JSONObject

所以

   Log.trace("url: " + s.toString()); 
       let parsedObj = that.parse(s); 
       Log.trace("parsedObj: " + parsedObj); // **** 

真的是异步的。 你会使用

parsedObj.then(function(jsobObject){ 
       for (var elmt of jsobObject) { 
        if (elmt.isNumber()) { 
         sum += elmt; 
         countNums++; 
        } 
        Log.trace("sum: " + sum); 
       } 

       Log.trace("sum: " + sum); 
}) 

你会想你的parsedObj(你的承诺)存储在一个阵列中使用的另一Promise.all()来fullfill你的父母承诺,当所有工作完成

得到的JSONObject
+0

非常感谢在这样做你的努力。我现在看到我出错的地方。最后一件事,它抱怨'''jsobObject''是任何类型的。你知道什么是最好的补救办法吗?我对JSON不太熟悉。 – chisquared

+0

好像你正在使用打字稿,这是javascript的超集。只要看看你可以设置的typecript文档。 像函数(jsonObject:object)(如果有东西像对象存在...) – Harper04

+0

正确。再次赞赏。祝你有美好的一天。 – chisquared

1

我想你是在parse()将返回解决方案,因为你的代码中有Promise.all()

由于你的代码很复杂,而且你使用的是延迟反模式,所以我已经清理了你的代码。

parse(url: string): any { 
    let rp = require('request-promise-native'); 
    return rp({ uri: url }) 
     .then(
      JSON.parse, 
      function(err){ 
       throw "Error: URL could not be retrieved" 
      } 
     ); 
} 


add(urls: string[]): Promise<number> { 
    return Promise.all(urls.map(this.parse)) 
     .then(function(arrays) { 
      let emptyArray = []; 
      //flatten 
      let numbers = emptyArray.concat.apply(emptyArray, arrays) 
       //remove non-numeric entries 
       .filter(function(v){ 
        return v.isNumber(); 
       }); 

      if(0 === numbers.length){ 
       throw "Error: No number was provided"; 
      } 

      //sum 
      return numbers.reduce(function(a,b){ 
       return a+b; 
      }); 
     }); 
} 

虽然我遗漏了日志。

有什么问题吗?

+0

在Promise.all(urls.map(this.parse))上真的很酷的使用map,并且比嵌套Promise.all()更好 – Harper04