2015-07-21 3 views
2

Так что я сейчас работаю над проектом, где я делаю http-запрос с угловым примерно до 1500 URL-адресов, ищущих json, который соответствует состоянию, которое у меня есть (только 1 URL-адресов будет соответствовать). В настоящее время у меня есть реализация, которая иногда работает (но не является детерминированной, я предполагаю, потому что запросы асинхронны, хотя это может быть просто ошибка?). Я по-прежнему новичок в угловатости, поэтому не уверен, что я делаю это правильно, поэтому я открыт для полного изменения кода!AngularJS looping через http get req, чтобы найти правильный url

this.matchingurl; 
this.data; 
this.findUrl = function(condition) { 
    var that = this; 
    for (var i = 0; i <= ; i++) { 
    // this is just looping through the url list 
    for (var i = 0; i < urlList.length; i++) { 
     for (var j = 0; j < urlList[i]['list'].length; j++) { 
     this.url = 'http://' + urlList[i]['list'][j] + restofurl; 
     var tempUrl = urlList[i]['list'][j]; 
     $http.get(this.url).success(function(data) { 
      if (condition is met in data) { 
      that.matchingurl = tempUrl; 
      return; 
      } 
     }) 
     .error(function(data){ 
      // error handling 
     }); 
     } 
    } 
    } 
} 

TLDR: matchingUrl - это не то, что я ожидаю? Все еще идет внутри цикла «условие», но не выплевывает правильный URL-адрес. Всегда дает мне тот же «url» для любого подсписка, правильно или неправильно.

+0

Я не понимаю, почему вы должны использовать '$ http.get()', если у вас уже есть URL, в массивах и хотите, чтобы сравнить его с чем-то? Также вы можете показать, как структурируются ваши списки? –

+0

@ DanielB, он хочет сравнить СОДЕРЖАНИЕ взятых данных с чем-то, а не с самим URL-адресом. – Fissio

+1

Это то, что я думал изначально, но способ формулировки вопроса и кода и его названия заставляют его звучать одинаково. Тем не менее, было бы неплохо увидеть структуру массивов URL. –

ответ

0

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

this.findUrl = function(condition) { 
    var urls =[], self = this, oUrl; // collect all the urls 
    urlList.forEach(function(list){ 
     list.forEach(function(url){ 
      oUrl.push(url); 
      urls.push('http://' + url + restofurl); // not sure where you are getting this restofurl from... 
     }); 
    }); 

    $q.all(urls.map(function(url){ 
     return $http.get(url); // returns promise for each url, thus mapping all urls to promise. 
    })).then(function(datas){ 
     datas.some(function(data, i){ 
      if(data == condition){ // change as per requirement 
       self.matchingurl = oUrl[i]; 
       return true; 
      } 
     }) 
    }); 
} 

Edit:

То же самое делается проверка одного URL в то время:

this.findUrl = function(condition) { 
    var urls =[], self = this, oUrl; // collect all the urls 
    urlList.forEach(function(list){ 
     list.forEach(function(url){ 
      oUrl.push(url); 
      urls.push('http://' + url + restofurl); // not sure where you are getting this restofurl from... 
     }); 
    }); 

    function check(i){ 
     function fail(){ // move to check the next url in the array 
      i++; 
      if(i<urls.length) return check(i); 
      console.log('none of the urls are matching');     
     } 

     return http.get(urls[i]).then(function(data){ 
      if(data == condition){ // change as per requirement 
       self.matchingurl = oUrl[i]; 
      }else{ 
       fail(); 
      } 
     }).catch(fail); 
    } 
    check(0); // start the chain 
} 
0

Вы правы, это вы могли бы возникают проблемы из-за синхронных вызовов http, если вы неправильно обрабатываете свои переменные. Вот фрагмент, который можно получить с помощью синхронных вызовов http.

this.matchingurl; 
 
this.data; 
 
this.findUrl = function(condition, i, j) { 
 
     var that = this; 
 
     this.url = 'http://' + urlList[i]['list'][j] + restofurl; 
 
     var tempUrl = urlList[i]['list'][j]; 
 
     $http.get(this.url).success(function(data) { 
 
      if (condition is met in data) { 
 
      that.matchingurl = tempUrl; 
 
      return; 
 
      } 
 
      else{ 
 
      if(urlList[i]['list'].length > j + 1){ 
 
       j++; 
 
      } 
 
      else{ 
 
       if(urlList.length > i+1){ 
 
       i++; 
 
       j=0; 
 
       } 
 
       else{ 
 
       return; 
 
       } 
 
      } 
 
      this.findUrl(condition, i, j); 
 
      } 
 
     }) 
 
     .error(function(data){ 
 
      // error handling 
 
     }); 
 
     } 
 
    } 
 
    } 
 
} 
 

 
this.findUrl(condition, 0, 0);

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