我正在创建一个Promise,它应该添加在数组/ JSON对象中找到的任何数字。
add()应该接受一串网址,并输出这些网址的总和。
我的方式如下:
我创建了一个名为parse的辅助函数,它接受一个字符串(url)并输出位于url的JSON对象。
我的问题是在由$$$$表示的区域,对象jsonObject
是正确解析的JSON对象。但是,在****表示的区域,紧接在我调用parse之后,parsedObj
不再是正确解析的JSON对象。
例如,如果我解析包含[ 1, 2, 5, 4 ]
的JSON对象,我将获得jsonObject = 1,2,5,4
但parsedObj = [object Promise]
。
为什么parsedObj
是[对象Promise]而不是1,2,5,4
的数组?
答案 0 :(得分:1)
parse(url: string): any
返回一个Promise而不是你的jsonObject
所以
Log.trace("url: " + s.toString());
let parsedObj = that.parse(s);
Log.trace("parsedObj: " + parsedObj); // ****
真的是异步的。 您将使用
获取jsonObjectparsedObj.then(function(jsobObject){
for (var elmt of jsobObject) {
if (elmt.isNumber()) {
sum += elmt;
countNums++;
}
Log.trace("sum: " + sum);
}
Log.trace("sum: " + sum);
})
您希望将parsedObj(您的Promises)存储在一个数组中,以便在完成所有工作后使用另一个Promise.all()来填充您的父承诺
答案 1 :(得分: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;
});
});
}
虽然,我已经遗漏了日志。
有任何问题吗?