2

У меня здесь немного смущение, поэтому я ищу немного руководства.Передача идентификатора функции с использованием Appcelerator Titanium

В принципе, у меня есть приложение, которое ведет переговоры с API и собирает информацию о «Турах». Первый запрос извлекает 3 тура (ID и имя) и сохраняет их в базе данных, второй запрос затем должен проходить три тура (с использованием конечной точки API конечной точки) и получать информацию (включая данные лон/лат) каждого тур.

Теперь это нормально работает.

Проблема, которую я испытываю, заключается в том, что каждый тур имеет свой собственный идентификационный номер. К сожалению, во втором и третьем турах используется тот же идентификационный номер, что и первый, когда они входят в базу данных.

Так что я предполагаю, что я не передаю идентификатор правильно.

Может ли кто-нибудь помочь получить этот цикл?

код ниже для всей функции ....

// get tours and add them to DB 
function loadTours() { 

    // get the species data 
    var loader = Titanium.Network.createHTTPClient({ 
     timeout: 30000 /* in milliseconds */ 
    }); 

    loader.onload = function() { 
     // get the JSON response 
     var tours = JSON.parse(this.responseText); 

     var db = Ti.Database.open('myDB'); 
     // truncate the tours table 
     db.execute('DELETE FROM tours'); 

     for (var i = 0; i < tours.length; i++) { 

      // Get the data from the feed 
      var tourID = tours[i].nid; 
      var tourTitle = tours[i].node_title.toUpperCase(); 

      Ti.API.info(tourID + ' ' + tourTitle); 


      // check if images have been uploaded 
      if (tours[i].app_image.uri) { 
       // removed 
      } else { 
       var tourImageFullPath = ""; 
      } 


      // add the tours to the SQL 
      db.execute('INSERT INTO tours (tourNID, tourName, tourImageURI) VALUES (?,?,?)', tourID, tourTitle, tourImageFullPath); 

      // lets do a loop through and insert the tour details 
      var getTourDetails = Titanium.Network.createHTTPClient({ 
       timeout: 30000 /* in milliseconds */ 
      }); 

      getTourDetails.onload = function() { 
       var tourDetails = JSON.parse(this.responseText); 
       db.execute('DELETE FROM tourdetails'); 
       for (var i = 0; i < tourDetails.length; i++) { 
        var tourNID = tourID; 
        var tourSpeciesID = tourDetails[i].node_field_data_field_tour_item_nid; 
        var tourType = tourDetails[i].node_field_data_field_tour_item_type; 

        if (tourDetails[i].Latitude.length === 0){ 
         var tourLat = ''; 
        } else { 
         var tourLat = tourDetails[i].Latitude; 
        } 

        if (tourDetails[i].Longitude.length === 0){ 
         var tourLon = ''; 
        } else { 
         var tourLon = tourDetails[i].Longitude; 
        } 

        if (tourDetails[i].node_field_data_field_tour_item_type.length === 0){ 
         var tourItemType = ''; 
        } else { 
         var tourItemType = tourDetails[i].node_field_data_field_tour_item_type; 
        } 

        var tourItemTitle = tourDetails[i].node_field_data_field_tour_item_title.toUpperCase(); 
        db.execute('INSERT INTO tourdetails (tourNID, tourItemID, tourLon, tourLat, tourItemTitle, tourItemType) VALUES (?,?,?,?,?,?)', tourNID, tourSpeciesID, tourLon, tourLat, tourItemTitle, tourItemType); 
        Ti.API.info('TOUR: ' + tourNID + ' ' + tourSpeciesID + ' ' + tourLon + ' ' + tourLat + ' ' + tourItemTitle + ' ' + tourItemType); 
       } 
      }; 

      getTourDetails.open("GET", "https://www.myapi.com/tour?nid=" + tourID); 

      // change the loading message 
      MainActInd.message = 'Downloading Data'; 
      // show the indicator 
      MainActInd.show(); 

      getTourDetails.send(); 

     } 

     // now load the map markers 
     getMapMarkers(); 

    }; //onload - end the JSON fetch and process for species 

    // Sets the HTTP request method, and the URL to get data from 
    loader.open("GET", "https://www.myapi.com/tours"); 

    // change the loading message 
    MainActInd.message = 'Downloading Data'; 
    // show the indicator 
    MainActInd.show(); 

    loader.onerror = function() { 
     // do something if an error 
     MainActInd.hide(); 
     //alert('tours data error'); 

     var errorDialog = Ti.UI.createAlertDialog({ 
      message: 'We are having an issue importing the Tour data. Please try again later.', 
      title: 'Whoops' 
     }); 

     errorDialog.show(); 


    }; 

    // Send the HTTP request 
    loader.send(); 

}; // end the get data function 

Я должен был маскировать несколько вещей, по соображениям безопасности, но вы должны получить представление о том, что я пытаюсь достичь!

Любая помощь была бы принята с благодарностью!

Simon

+0

Вы могли бы добавить информацию о вызовах info()? И, возможно, измените внутренний цикл на другое имя переменной (не уверен, что его можно повторно использовать там) – miga

+0

Это информационный вывод (образец), который вы можете видеть, все элементы имеют одинаковый начальный идентификатор. [INFO]: ТУР: 26395 26873 -0,151982000000 +51,533740000000 BLACKBURN выставка [INFO]: ТУР: 26395 22766 -0,152011000000 51,535223000000 ГИАЦИНТ MACAW животное –

+0

И другая информация вызова для экскурсий сами выглядит следующим образом: [INFO]: 33506 TOUR 1 [INFO]: 33505 TOUR 2 [INFO]: 26395 TOUR 3 –

ответ

0

Проблема здесь состоит в том, что заканчивается внешний контур (I находится на последнем месте, так что ваш tourID). После цикла вызывается обратный вызов из функции отправки, где вы снова используете tourID. Но в то время он находится на последнем идентификаторе, который отображается в вашей информации(). Самый быстрый (и более безопасный) метод заключается в том, чтобы включить идентификатор в фактический обратный вызов с сервера, поэтому в:

var tourDetails = JSON.parse (this.responseText);

shoulb be the tourID как поле json

+0

К сожалению, я не могу изменить возврат API, это было бы наиболее логично, но у меня нет возможности его изменить. Любым другим путем? –

+0

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

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