Отправка всего массива (без дубликатов) в mongolab с помощью Javascript XMLHttpRequest

В моем коде у меня есть цикл for, который перебирает объекты в массиве (это, очевидно, не проблема). Далее мне удается отправить этот массив в базу данных:

var jsonObject = '{"object":' + '"' + array + '"' + '}';
var xhr = new XMLHttpRequest();
    xhr.open("POST", MYAPIURL);
    xhr.setRequestHeader("Content-Type", "application/json");
    xhr.send(jsonObject);

Проблема в том, что мне нужно проверить БД, если некоторые объекты в массиве уже существуют! Поэтому я подумал, что создание нового цикла for и открытие нового XMLHttpRequest для каждого из объектов в массиве поможет мне, но я не могу заставить его работать. С кодом ниже он просто отправляет последний объект в массиве столько раз, сколько объектов в массиве.

Код:

for(var i = 0; i < objectList.length; i++){
    xhr = new XMLHttpRequest();
    xhr.open("GET", MYAPIURL);
    xhr.onreadystatechange = function(){

        var response = xhr.responseText;

        if(response.length === 0){                     
            var jsonObject = '{"collectedobject":' + '{"objectname" : "' + objectList[i] + '", "weight" : 1}}';

            xhr.open("POST", MYAPIURL);
            xhr.setRequestHeader("Content-Type", "application/json");
            xhr.send(jsonObject);

        } else {
            for(var i = 0; i < response.length; i++){
                var tempObject = response[i];
                var newWeight = tempObject.collectedobject.weight + 1;
                var updatedJson = '{"collectedobject":{"objectname" : "' + tempObject.collectedobject.objectname + '", "weight" : ' + newWeight + '}}';

                xhr.open("PUT", MYAPIURL );              
                xhr.setRequestHeader("Content-Type", "application/json");
                xhr.send(updatedJson);
            }
        }
    }            
    xhr.send();
}

Я вроде нашел решение, но оно настолько плохое, насколько это возможно!

for(var i = 0; i < urls.length; i++){
    var xhr = new XMLHttpRequest();
    xhr.open("GET", MYAPI);
    xhr.onreadystatechange = function(){

    var response = JSON.parse(xhr.responseText);
    if(response.length === 0){   
        for(var i = 0; i < urls.length; i++){                  
            var jsonObject = '{"spider":' + '{"url" : "' + urls[i] + '", "weight" : 1}}';
            alert("PostToDB: " + jsonObject);
            xhr.open("POST", "MYAPI");
            xhr.setRequestHeader("Content-Type", "application/json");
            xhr.send(jsonObject);
        }
    }
...

Что я сделал, так это добавил цикл перед открытием соединения с API/DB, а затем перебрал массив, содержащий URL-адреса, прежде чем продолжить с ними работу. Проблема в том, что это не работает без предупреждения. Кажется, предупреждение устанавливает тайм-аут или что-то. Если я удаляю предупреждение, единственный объект, размещаемый в БД, является последним в массиве (и да, я пробовал с несколькими массивами!)

У кого-нибудь есть идеи по поводу моей "новой" проблемы?

0 ответов

Другие вопросы по тегам