2015-08-21 2 views
0

Я использую фоновое задание для запроса json с тысячами объектов, чтобы изначально заполнить мою базу данных. Я также реализовал функцию beforesave для предотвращения дублирования записей. Однако, как только я это осуществил, кажется, что моя фоновая работа называется response.error и не сохраняет все объекты. Похоже, я могу превышать запросы/сек? Я был бы очень признателен, если бы кто-нибудь мог взглянуть на мой код и сказать мне, почему он не сохраняет все записи успешно.Неудача Работа фона фона при использовании beforesave с тысячами объектов

Вот моя фоновая работа:

Parse.Cloud.job("testing", function(request, response) { 

    var json; 

    Parse.Cloud.httpRequest({ 
     url: stringURL + pageNumber.toString(), 
     success: function(httpResponse) { 

     json = httpResponse.data; 
     console.log("total is: " + json["meta"].total); 
     console.log("object 1 is: " + json["events"][1].title); 
     return json; 
     } 
    //after getting the json, save all 1000 
    }).then(function() { 
//helper function called 
     saveObjects(json).then(function() { 
      response.success("success"); 
     }, 
     function(error) { 
      response.error("nooooo"); 
     }); 
    }); 
}); 

function saveObjects(json) { 
    var promises = []; 
    for(var i = 0; i < 1000; i++) { 
     var newEvent = new Event(); 
     promises.push(newEvent.save(new Event(json["events"][i]))); 
    } 
    return Parse.Promise.when(promises); 
} 

Вот мой BeforeSave код:

Parse.Cloud.beforeSave("Event", function(request, response) { 
    var newEvent = request.object; 
    var Event = Parse.Object.extend("Event"); 
    var query = new Parse.Query("Event"); 

    query.equalTo("title", newEvent.get("title")); 
    query.equalTo("datetime_utc", newEvent.get("datetime_utc")); 
    query.equalTo("url", newEvent.get("url")); 
    query.first({ 

    success: function(temp) { 
     response.error({errorCode:123,errorMsg:"Event already exist!"});   
    }, 
    error: function(error) { 
     response.success(); 
    } 
    }); 
}); 

Спасибо Я очень признателен за любую помощь ... Я застрял на некоторое время.

ответ

0

Если это проблема с запросом, то вы, вероятно, могли бы использовать что-то вроде node-function-rate-limit, но довольно просто написать свой собственный дозатор ограничения скорости. См. Ниже doInBatches().

Кроме того, при использовании методов возврата обещаний, которые также предлагают обратный вызов «success: ...», лучше не смешивать два стиля. Он может вести себя так, как ожидалось, но вы лишены возможности передать результаты от «успешного: ...» обратного вызова к остальной части цепочки обещаний. Как вы можете видеть ниже, код «success: ...» просто был перетасован в обратный вызов .then().

Parse.Cloud.job("testing", function(request, response) { 
    Parse.Cloud.httpRequest({ 
     url: stringURL + pageNumber.toString() 
    }).then(function(httpResponse) { 
     var json = httpResponse.data; 
     // console.log("total is: " + json.meta.total); 
     // console.log("object 1 is: " + json.events[1].title); 
     /* helper function called */ 
     doInBatches(json.events, 30, 1000, function(evt, i) { 
       var newEvent = new Event(); 
      return newEvent.save(new Event(evt)); 
     }).then(function() { 
      response.success('success'); 
     }, function(error) { 
      response.error('nooooo'); 
     }); 
    }); 
}); 

// Async batcher. 
function doInBatches(arr, batchSize, delay, fn) { 
    function delayAsync() { 
     var p = new Parse.Promise(); 
     setTimeout(p.resolve, delay); 
     return p; 
    } 
    function saveBatch(start) { 
     if(start < arr.length) { 
      return Parse.Promise.when(arr.slice(start, start+batchSize).map(fn)) 
      .then(delayAsync) // delay between batches 
      .then(function() { 
       return saveBatch(start + batchSize); 
      }); 
     } else { 
      return Parse.Promise.as(); 
     } 
    } 
    return saveBatch(0); 
} 

Я не вижу, как и почему код beforesave может повлиять на вещи.

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