JSON解析无极行为不正确
我创建这应该添加在数组/ 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
?
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非常感谢在这样做你的努力。我现在看到我出错的地方。最后一件事,它抱怨'''jsobObject''是任何类型的。你知道什么是最好的补救办法吗?我对JSON不太熟悉。 – chisquared
好像你正在使用打字稿,这是javascript的超集。只要看看你可以设置的typecript文档。 像函数(jsonObject:object)(如果有东西像对象存在...) – Harper04
正确。再次赞赏。祝你有美好的一天。 – chisquared
我想你是在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;
});
});
}
虽然我遗漏了日志。
有什么问题吗?
在Promise.all(urls.map(this.parse))上真的很酷的使用map,并且比嵌套Promise.all()更好 – Harper04
你能提供一个小提琴吗? – Harper04
@ Harper04对不起,这是什么? – chisquared
可以请你在$$$$部分记录'url'参数吗?你确定返回的元素是一个字符串吗? – briosheje