JSON解析Promise行为不正常

时间:2017-01-16 12:08:28

标签: javascript json parsing typescript

我正在创建一个Promise,它应该添加在数组/ JSON对象中找到的任何数字。

add()应该接受一串网址,并输出这些网址的总和。

我的方式如下:

我创建了一个名为parse的辅助函数,它接受一个字符串(url)并输出位于url的JSON对象。

我的问题是在由$$$$表示的区域,对象jsonObject是正确解析的JSON对象。但是,在****表示的区域,紧接在我调用parse之后,parsedObj不再是正确解析的JSON对象。

例如,如果我解析包含[ 1, 2, 5, 4 ]的JSON对象,我将获得jsonObject = 1,2,5,4parsedObj = [object Promise]

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

2 个答案:

答案 0 :(得分:1)

parse(url: string): any返回一个Promise而不是你的jsonObject

所以

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

真的是异步的。 您将使用

获取jsonObject
parsedObj.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;
            });
        });
}

虽然,我已经遗漏了日志。

有任何问题吗?