2015-09-29 3 views
1

Я работаю над написанием кода Parse Cloud, который вытаскивает JSON из стороннего API. Я хотел бы изменить его, проверить и посмотреть, существует ли он, а если нет, сохраните его. У меня возникают проблемы с сохранением объекта после проверки, существует ли он.Сохранение объектов после запроса синтаксического анализа в облачном коде

Вот пример того, что я пытаюсь сделать. Когда я добираюсь до блока успеха, мне нужен оригинальный объект автомобиля, чтобы я мог сохранить его в parse db. Однако это не определено. Я новичок в JS, и, вероятно, здесь нет ничего очевидного.

for (var j = 0, leng = cars.length; j < leng; ++j) { 
    var car = cars[j];   
    var Car = Parse.Object.extend("Car"); 
    var query = new Parse.Query(Car);   
    query.equalTo("dodge", car.model); 
    query.find({ 
     success: function(results) { 
      if (results.length === 0) { 
      //save car... but here car is undefined. 
      } 
     }, 
     error: function(error) { 
     console.error("Error: " + error.code + " " + error.message); 
     } 
    }); 
} 

Если бы кто-нибудь мог указать мне в правильном направлении, я был бы очень признателен. Благодаря!

ответ

1

Обещания действительно упростят вашу жизнь, как только вы привыкнете к ним. Вот пример шаблона обновления или создания с использованием обещаний ...

function updateOrCreateCar(model, carJSON) { 
    var query = new Parse.Query("Car"); 
    query.equalTo("model", model); 
    return query.first().then(function(car) { 
     // if not found, create one... 
     if (!car) { 
      car = new Car(); 
      car.set("model", model); 
     } 
     // Here, update car with info from carJSON. Depending on 
     // the match between the json and your parse model, there 
     // may be a shortcut using the backbone extension 
     car.set("someAttribute", carJSON.someAttribute); 
     return (car.isNew())? car.save() : Parse.Promise.as(car); 
    }); 
} 

// call it like this 
var promises = []; 
for (var j = 0, leng = carsJSON.length; j < leng; ++j) { 
    var carJSON = carsJSON[j]; 
    var model = carJSON.model; 
    promises.push(updateOrCreateCar(model, carJSON)); 
} 
Parse.Promise.when(promises).then(function() { 
    // new or updated cars are in arguments 
    console.log(JSON.stringify(arguments)); 
}, function(error) { 
    console.error("Error: " + error.code + " " + error.message); 
}); 
+0

Работает как сон! Благодаря! – Corgrimm

1

Ваша функция возвращается до возврата метода find. Это асинхронный характер js. Используйте что-то вроде async.parrallel из async lib. http://npm.im/async

Update 20150929:

Вот код, чтобы показать вам, как я это делаю, это со стороны, проектом я работал. Данные были сохранены в MongoDB и были доступны с помощью Mongoose ODM. Я использую Async waterfall, так как мне нужно значение async-функции в следующем методе ... следовательно, имя waterfall в async lib. :)

async.waterfall([ 
    // Get the topics less than or equal to the time now in utc using the moment time lib 
    function (done) { 
     Topic.find({nextNotificationDate: {$lte: moment().utc()}}, function (err, topics) { 
      done(err, topics); 
     }); 
    }, 
    // Find user associated with each topic 
    function (topics, done) { 
     // Loop over all the topics and find the user, create a moment, save it, 
     // and then send the email. 
     // Creating moment (not the moment lib), save, sending email is done in the 
     // processTopic() method. (not showng) 
     async.each(topics, function (topic, eachCallback) { 
       processTopic(topic, eachCallback); 
      }, function (err, success) { 
       done(err, success); 
      } 
     ); 
    } 
    // Waterfall callback, executed when EVERYTHING is done 
], function (err, results) { 
    if(err) { 
     log.info('Failure!\n' + err) 
     finish(1); // fin w/ error 
    } else { 
     log.info("Success! Done dispatching moments."); 
     finish(0); // fin w/ success 
    } 
}); 
Смежные вопросы