2016-01-02 4 views
2

Я пишу отдельные результаты из массива JSON в базу данных Parse.com. Попытка процесс выглядит следующим образом:if/else statement в цикле for

Для каждого результата элемента в массиве JSON - поиск столбца «EAN» в классе «TestClass» для содержания «JSON Результат: EAN».

Тогда ...

Если JSON Результат: EAN присутствует: - console.log ("Уже в БД");

Else

Написать JSON Результат: EAN в Разбор БД: EAN & JSON Результат: Имя в Разбор БД: имя

Проблема, которую я что если я скажу 20 результатов с разными именами & EAN numbers - если предположить, что ни один из них не находится в d atabase, ниже сценарий записывает 20 результатов в базу данных, но каждая запись содержит имя & Номер EAN последнего результата JSON.

Вот упрощенная версия моего рабочего кода:

$.ajax(settings).done(function(response) { 
    var Products = Parse.Object.extend("TestClass"); 

    for (i in response.Products) { 
     var name = response.Products[i].Name; 
     var EAN = response.Products[i].EANBarcode; 

     var query = new Parse.Query(Products); 
     query.equalTo("EAN", EAN); 
     query.find({ 
      success: function(results) { 
       if (results.length > 0) { 
        var no = results[0].get("EAN"); 
        var title = results[0].get("name"); 
        console.log("ALEADY HERE: " + "[" + no + "] " + title); 
       } else { 
        console.log('No matching records for' + name); 
        var newProduct = new Products(); 
        newProduct.set("name", name); 
        newProduct.set("EAN", EAN); 
        newProduct.save({ 
         success: function() { 
          console.log("Saved: " + name); 
         }, 
         error: function(error) { 
          console.log("Error: " + error.message); 
         } 
        }); 
       } 
      }, 
     }); 
    }); 

Если я не запрашивать продукт & писать прямо в базу данных (то есть: не используйте query.find) & применить код следующим образом, запись базы данных репликация 20 различных результатов вы ожидаете:

$.ajax(settings).done(function(response) { 

    var Products = Parse.Object.extend("TestClass"); 

    for (i in response.Products) { 

     var name = response.Products[i].Name; 
     var EAN = response.Products[i].EANBarcode; 

     var newProduct = new Products(); 

     newProduct.set("name", name); 
     newProduct.set("EAN", EAN); 

     newProduct.save({ 
      success: function() { 
       console.log("Saved: " + name); 
      }, 
      error: function(error) { 
       console.log("Error: " + error.message); 
      } 
     }), 
    }); 
}); 

Я не могу понять, почему ниже код работает, но тогда не при входе в .find команды?

ответ

2

Способ, которым я обнимаю такие проблемы (несколько асинхронных операций в циклах и условностях), заключается в том, чтобы разложить на более простые операции и связать их с обещаниями. Так, например, позволяет иметь функцию, которая находит продукт Дано «EAN» ...

function productWithEAN(EAN) { 
    var Products = Parse.Object.extend("TestClass"); 
    var query = new Parse.Query(Products); 
    query.equalTo("EAN", EAN); 
    return query.first(); 
} 

А вот тот, который создает продукт с именем и EAN ...

function createProduct(name, EAN) { 
    var Products = Parse.Object.extend("TestClass"); 
    var newProduct = new Products(); 
    newProduct.set("name", name); 
    newProduct.set("EAN", EAN); 
    return newProduct.save(); 
} 

Теперь давайте цикл response.Products, искать соответствующие продукты в разборе, создавая, если мы не найдем матч ...

function findOrCreateProducts(response) { 
    var promises = response.Products.map(function(p) { 
     var name = p.Name; 
     var EAN = p.EANBarcode; 
     return productWithEAN(EAN).then(function(product) { 
      return (product)? product : createProduct(name, EAN); 
     }); 
    }); 
    return Parse.Promise.when(promises).then(function() { 
     // return a proper array 
     return Array.prototype.slice.call(arguments); 
    }); 
} 

EDIT Разъяснения модели данных немного. Следующий пример предполагает класс UserInventory, который имеет как минимум два атрибута указателя: один указатель на Product под названием «product» и один указатель на Parse.User, называемый «user».

// return a promise to create user inventory for a user and product 
function createUserInventory(user, product) { 
    var UserInventory = Parse.Object.extend("UserInventory"); 
    var newUI = new UserInventory(); 
    newUI.set("user", user); 
    newUI.set("product", product); 
    return newUI.save(); 
} 

// return a promise to create user inventory for a user and product, only if one doesn't exist 
function findOrCreateUserInventory(user, product) { 
    var query = new Parse.Query("UserInventory"); 
    query.equalTo("user", user); 
    query.equalTo("product", product); 
    return query.first().then(function(userInventory) { 
     return (userInventory)? userInventory : createUserInventory(user, product); 
    }); 
} 

// return a promise to create a user's inventory from a remote api response 
function buildUserInventoryFromRemoteSearch(user, response) { 
    return findOrCreateProducts(response).then(function(products) { 
     var promises = products.map(function(product) { 
      return findOrCreateUserInventory(user, product); 
     }); 
     return Parse.Promise.when(promises).then(function() { 
      // return a proper array 
      return Array.prototype.slice.call(arguments); 
     }); 
    }); 
} 

Назовите это ...

$.ajax(settings).done(function(response) { 
    var user = Parse.User.current(); 
    buildUserInventoryFromRemoteSearch(user, response).then(function(result) { 
     // at this point, everything is done 
    }, function(error) { 
     // something went wrong 
    }); 
}); 

Кстати, на какое-то время, то это будет необходимо принести инвентаризации пользователя ...

function userInventoryForUser(user) { 
    var query = new Parse.Query("UserInventory"); 
    query.equalTo("user", user); 
    query.include("user"); 
    query.include("product"); 
    return query.find(); 
} 

Надеюсь, вы можете изучить это, чтобы получить навык подхода. Основная идея: небольшие, обещающие функции, которые выполняют логические куски или работают.

+0

Я получаю следующее сообщение консоли: Не указано ReferenceError: _ не определено –

+1

Собственно, только с использованием карты, ее просто отлично в чистом JS. изм. – danh

+0

Да, раньше требовалось var. Тестирование нового кода сейчас ... –