2014-02-14 5 views
-2

У меня есть функция, которая подталкивает обещания от других функций, которые также разрешают массивы обещаний. Мне просто интересно, был ли этот код в порядке.JQuery откладывает другие отложенные ответы

Вот главная функция

/// <summary>Process the validation results (invalid IDR records will have the iop=4)</summary> 
this.processValidationResults = function() 
{ 
    var promises = []; 
    var count = (self.idrValidationList.length - 1); 

    $.each(self.idrValidationList, function (index, idrValidationItem) 
    { 
     _onProgress(self.utils.formatCounterMessage(index, count, 'Processing Validation Items')); 

     if (idrValidationItem.is_valid = 0) 
     { 
      //there is a problem with this IDR record 
      //update the idr_insp table 
      promises.push(self.updateInvalidEntity(self.configEntities.idr_insp, idrValidationItem.idr_insp_id)); 
      promises.push(self.updateInvalidChildren(self.configEntities.idr_insp, idrValidationItem.idr_insp_id)); 
     } 
     else 
     { 
      //push resolved promise 
      promise.push($.when()); 
     }  
    }); 

    return ($.when.apply($, promises)); 
} 

Вот функции, которые вызываются функцией выше

/// <summary>Update the invalid record, sets the IOP field to 4 [Cannot sync due to issue]</summary> 
/// <param name="entity" type="Object">GLobal entity definiton </param> 
/// <param name="tabletId" type="Int">Primary Key on the tablet to change</param> 
this.updateInvalidEnity = function (entity, tabletId) 
{ 
    //update the record with the new ID and IOP status 
    var updateSql = 'UPDATE ' + entity.name + ' SET iop=? WHERE ' + entity.key_field + '=?'; 

    //update the record 
    return (self.db.executeSql(updateSql, [4, tabletId])); 
} 

/// <summary>Update the invalid child records, sets the IOP field to 4 [Cannot sync due to issue]</summary> 
/// <param name="entity" type="Object">GLobal entity definiton </param> 
/// <param name="keyId" type="Int">Foreign Key on the tablet to change</param> 
this.updateInvalidChildren= function (parentEntity, keyId) 
{ 
    var promises = []; 
    $.each(parentEntity.child_entities, function (index, child) 
    { 
     var def = new $.Deferred(); 
     var updateSql = 'UPDATE ' + child.child_name + ' SET iop=? WHERE ' + child.key_field + '=?'; 

     promises.push(self.db.executeSql(updateSql, [4, keyId])); 
    }); 

    return ($.when.apply($, promises)); 
} 

И все вышеперечисленные методы толкают отсроченной ниже.

/* Executes the sql statement with the parameters provided and returns a deffered jquery object */ 
this.executeSql = function (sql, params) 
{ 
    params = params || []; 

    var def = new $.Deferred(); 

    self.db.transaction(function (tx) 
    { 
     tx.executeSql(sql, params, function (itx, results)// On Success 
     { 
      // Resolve with the results and the transaction. 
      def.resolve(itx, results); 
     }, 
     function (etx, err)// On Error 
     { 
      // Reject with the error and the transaction. 
      def.reject(etx, err); 
     }); 
    }); 

    return (def.promise()); 
} 

Является ли эта цепь звуком? Еще не проверял, но я думаю, что все в порядке. Просто хочу некоторые другие глаза на это, прежде чем я продолжу ...

+3

Разве это не слишком много спрошено, просто проверьте, может ли кто-нибудь найти проблему, если вы даже не проверили ее самостоятельно ?! Почему бы вам просто не узнать, работает ли это или нет? – Martin

+1

@Martin, поскольку в базе данных локальных планшетов в настоящее время нет данных. Мне поручено писать код синхронизации данных без данных. Просто задаю вопрос. Я не думаю, что этот вопрос трудно для любого, кто понимает отложенные. Так что дайте ответ или сохраните свой бессмысленный комментарий для себя ... – gdex

+0

Довольно агрессивный ... – Martin

ответ

1

Это должно быть действительно в Code Review, не так, но здесь идет ...

Несколько замечаний:

  • Как написано , сообщение о ходе выполнения в .processValidationResults(), является указанием на выполненные запросы, а не на полученные ответы. Поэтому он будет прыгать прямо к «счету счета».

  • В .processValidationResults(), else { promise.push($.when()); } не нужно.

  • В .updateInvalidChildren(), var def = $.Deferred() не нужно.

  • jQuery Deferred's resolve и reject методы «отделимы». В this.executeSql(), так как вы просто хотите передать параметры, вы можете упростить вызов tx.executeSql(...) до tx.executeSql(sql, params, def.resolve, def.reject).

  • Предполагая, что self.db.executeSql выполняет AJAX (и что tx.executeSql() не как-то в очереди запросов), код имеет потенциал, чтобы ударить сервер трудно с одновременными запросами. Убедитесь, что он может обрабатывать количество одновременных запросов, которые этот код будет генерировать. В противном случае, принять меры, чтобы заставить запросы выполняться последовательно.

+0

Спасибо, что предоставил свой ввод, я отправлю в Обзор кода на данный момент. В вашей второй пуле, я думаю, вы говорите, что нет необходимости толкать пустую отложенную? Итак, если в массиве ничего нет, $ .when.apply вернет разрешенное обещание? ExecuteSql является частью aync API для SQLite, поэтому он не делает запрос сервера просто обновлением локальной базы данных SQLite на устройстве, поэтому я думаю, что я в порядке. Еще раз спасибо за ваши комментарии – gdex

+0

'$ .when()' и '$ .when.apply ($, [])' являются идентичными операторами. Ваш код уже (правильно) предполагает, что '$.когда() 'возвращает разрешенное обещание. Поэтому совершенно безопасно предположить, что '$ .when.apply ($, [])' также вернет разрешенное обещание. Доказательство здесь: http://jsfiddle.net/SWU8D/. С другой стороны, я не уверен, что вы можете игнорировать возможность перегрузки SQL-запросов. Может быть, SQLite DB будет в порядке с несколькими быстрыми запросами, может быть, нет - я не знаю. Убедитесь, что ваш тестовый режим дает достаточно стресса для вашего удовольствия. –

+0

Еще раз спасибо! Модульные тесты, безусловно, сильно ударят по плагину SQLite. В текущем проекте БД имеется небольшая сумма (макс. 5) дочерних дочерних объектов для любого данного родительского объекта. Мы не ожидаем огромного количества обновлений в этой конкретной части синхронизации, но опять же это также будет зависеть от того, как часто конечный пользователь синхронизирует данные, поэтому ваша точка действительна. – gdex

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