2017-01-16 11 views
1

配列/ JSONオブジェクトにある数字を追加するPromiseを作成しています。JSONを解析するPromiseが正しく動作しない

add()はURLの文字列を取り込み、それらのURLの合計を出力することになっています。

次のように私はそれを行っている方法は次のとおりです。

私は、文字列(URL)を取り込んで出力がJSONオブジェクトのURLにある必要があり、解析と呼ばれるヘルパー関数を作成しました。

私の問題は、$$$$で示される領域では、オブジェクトjsonObjectが正しく解析されたJSONオブジェクトです。しかし、****で示される領域では、構文解析と呼ばれる直後に、parsedObjはもはや正しく解析されたJSONオブジェクトではなくなりました。

たとえば、[ 1, 2, 5, 4 ]を含むJSONオブジェクトを解析すると、jsonObject = 1,2,5,4となりますが、parsedObj = [object Promise]となります。

なぜparsedObj1,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); // **** 

が本当に非同期で返します。あなたは、すべての作業が

を行った場合、あなたの親の約束を気力する別のPromise.all()を使用するようにアレイ内のあなたのparsedObj(あなたの約束を)保存したいと思う

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

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

を使用してjsonObjectを取得します

+0

これをやることに非常に感謝します。私は今どこが間違っているかを見ます。最後の1つですが、 '' 'jsobObject'''はany型です。あなたはこれを改善する最良の方法が何であるか知っていますか?私はJSONにあまり慣れていません。 – chisquared

+0

javascriptのスーパーセットであるtypescriptを使用しているようです。あなたが設定できるタイプスクリプトのドキュメントを調べてください。 のような関数(jsonObject:オブジェクト)(オブジェクトのようなものが存在する場合...) – Harper04

+0

正しい。再度感謝しています。すてきな一日を。 – chisquared

1

あなたのコードにPromise.all()があるという理由だけで、parse()が解決されたとの前提になっていると思います。

あなたのコードは複雑で、遅延反パターンを使用しているので、コードを整理しました。

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))でマップを実際に使用すると、Promise.all()のネストよりもはるかに優れています – Harper04

関連する問題