2017-01-16 4 views
1

Я создаю Promise, который должен добавить любые числа, найденные в объекте array/JSON.JSON parsing Promise не ведет себя правильно

add() предполагается взять в строке URL-адресов и вывести сумму этих URL-адресов.

так, как я сделал это следующим образом:

Я создал вспомогательную функцию под названием синтаксического анализа, которая принимает строку (URL-адрес) и должен вывести объект JSON, расположенный в ссылке.

Моя проблема в том, что в области, обозначенной $$$$, объект jsonObject является правильно разобранным объектом JSON. Но в области, обозначенной символом ****, сразу после того, как я вызываю синтаксический анализ, parsedObj больше не является правильно разобранным объектом JSON.

Например, если я разбираю объект JSON, содержащий [ 1, 2, 5, 4 ], я получу 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); // **** 

действительно является асинхронным. Вы получите 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 (свои обещания) в массиве использовать другой Promise.all(), чтобы FULLFILL вашего родительское обещания, когда вся работа сделана

+0

Большое спасибо за ваши усилия в этом. Теперь я вижу, где я ошибся. Но последнее, однако, жалуется, что '' 'jsobObject''' имеет тип any. Знаете ли вы, что лучший способ исправить это? Я не очень хорошо знаком с JSON. – chisquared

+0

Похоже, вы используете машинопись, которая является надмножеством javascript. Просто загляните в документацию по машинописи, которую вы можете установить. подобный функция (jsonObject: объект) (если что-то вроде объекта существует ...) – 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)) и намного лучше, чем вложение Promise.all() s – Harper04

Смежные вопросы