jQuery: проблема с заполнением массива при вызове $ .getJSON - PullRequest
1 голос
/ 19 мая 2011

Это код (см. КОД), который я использую, когда пытаюсь создать новый документ CouchDB. Документ содержит один или несколько существующих документов CouchDB (отслеживание истории). Результирующий JSON (см. JSON) для вновь созданного документа выглядит примерно так:

JSON:
{<br> "_id": "b3360050039389801524044daf1c963c",<br> "_rev": "1-2a5da40ce9a191b4decc27411ec9a181",<br> "hodoc_type": "INCOMMING DELIVERY NOTE",<br> "user_from": "ANS USER",<br> "status": "INSTALLED ON SITE",<br> "category": "ASET",<br> "location": "MTX SPARE",<br> "doctype": "hodoc",<br> "items": [<br> {<br> "serial_number": "310310007590",<br> "status": "STORED IN WAREHOUSE",<br> "doctype": "data",<br> "supplier": "INTRACOM",<br> "po": "0",<br> "category": "SPARE PART",<br> "user_out": "IGOR JURUKOV",<br> "mac": "NULL",<br> "eqtype": "IDU",<br> "location": "MTX SPARE",<br> "location_comment": "NULL",<br> "date_in": "2011-05-06",<br> "date_out": "2011-05-06",<br> "prf": "0",<br> "part_number": "Z00-404/63.01",<br> "user_in": "KOTE JANAKIEVSKI",<br> "bar_code": "0",<br> "manufacturer": "INTRACOM",<br> "rma": "NULL",<br> "product_name": "PSU for IDR-SM"<br> },<br> {<br> "serial_number": "310407016955",<br> "status": "STORED IN WAREHOUSE",<br> "doctype": "data",<br> "supplier": "INTRACOM",<br> "po": "0",<br> "category": "SPARE PART",<br> "user_out": "IGOR JURUKOV",<br> "mac": "NULL",<br> "eqtype": "IDU",<br> "location": "MTX SPARE",<br> "location_comment": "NULL",<br> "date_in": "2011-05-06",<br> "date_out": "2011-05-06",<br> "prf": "0",<br> "part_number": "Z00-404/63.02",<br> "user_in": "KOTE JANAKIEVSKI",<br> "bar_code": "0",<br> "manufacturer": "INTRACOM",<br> "rma": "NULL",<br> "product_name": "PSU for IDR-SM"<br> }<br> ]<br> }

КОД:
var docids = new Array();<br> var items = new Array();<br> $('div#divitemsout').find('img.item-out-remove').each(function () {<br> var id = $(this).attr('attrid');<br> if (docids.indexOf(id) == -1) {<br> docids.push(docid);<br> }<br> var item = new Object;<br> $.getJSON('/whdb/' + id, function(data) {<br> $.each(data, function(key, val) {<br> if (key !== "_id" && key !== "_rev") {<br> item[key] = val;<br> }<br> });<br> // Check No.1<br> //alert(item.manufacturer);<br> });<br> // Check No.2<br> //alert(item.manufacturer);<br> items.push(item);<br> });

Проблема и вопрос заключаются в следующем: когда прокомментирована строка ниже Проверки № 2, часть «items» результирующего документа json - []. Когда предупреждение (item.manufacturer) ниже «Проверка № 2» не закомментировано, я получаю оповещения с содержимым «undefined», но часть «items» полученного документа json установлена ​​правильно, как показано в примере. Любое предложение?

1 Ответ

1 голос
/ 19 мая 2011

Проблема только в сроках. Функция, которую вы передаете getJSON, не вызывается, пока веб-сервер не вернет ответ на ваш запрос. Таким образом, item не будет определен сразу после вызова getJSON. Добавление вызовов alert просто замедляет процесс, поэтому асинхронный вызов успевает завершиться.

Попробуйте переместить строку items.push(item) внутри обратного вызова getJSON.

Редактировать

Чтобы прояснить ситуацию, попробуйте это (в Chrome или Firefox с открытым Firebug, чтобы у вас была правильная функция console.log):

var docids = new Array();
var items = new Array();
var waiting = 0;
$('div#divitemsout').find('img.item-out-remove').each(function () {
  var id = $(this).attr('attrid');
  if (docids.indexOf(id) == -1) {
    docids.push(docid);
  }
  var item = new Object;
  waiting++;
  $.getJSON('/whdb/' + id, function(data) {
    waiting--;
    $.each(data, function(key, val) {
      if (key !== "_id" && key !== "_rev") {
        item[key] = val;
      }
    });
    items.push(item);
    if(waiting == 0) {
      console.log('items:', items);
    }
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...