2011-05-19 9 views
1

これは新しいCouchDBドキュメントを作成しようとするときに使用するコード(CODEを参照)です。ドキュメントには、1つまたは複数の既存のCouchDBドキュメント(履歴追跡)が含まれています。

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

CODE:
var docids = new Array();
var items = new Array();
$('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;
  $.getJSON('/whdb/' + id, function(data) {
    $.each(data, function(key, val) {
      if (key !== "_id" && key !== "_rev") {
        item[key] = val;
      }
    });
    // Check No.1
    //alert(item.manufacturer);
  });
  // Check No.2
  //alert(item.manufacturer);
  items.push(item);
  });

問題や質問がある:ライン怒鳴る新しく作成されたドキュメントの結果のJSONは(JSONを参照)のようなものですチェックNo.2がコミントされている場合、結果のjsonドキュメントの「items」部分は[]です。チェック番号2の警告(item.manufacturer)がコメント解除されると、内容が「未定義」のアラートが表示されますが、例のように結果のjsonドキュメントの「items」部分が正しく設定されます。なにか提案を?

答えて

1

問題はちょうどタイミングです。 getJSONに渡す関数は、Webサーバーからリクエストに対する応答が返されるまで呼び出されません。したがってitemは、getJSONの呼び出しの直後には定義されません。 alertの呼び出しを追加すると、処理が遅くなり、非同期呼び出しが完了するまでに時間がかかります。

items.push(item)行をgetJSONコールバック内に移動してみてください。

編集

(あなたが適切なconsole.log機能を持つように、Firebugのオープンを使ってChromeやFirefoxで)これを試して、物事を明確にする:

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); 
    } 
    }); 
}); 
+0

私はすでにそれを試してみました。同じ問題。入力いただきありがとうございます。 –

+0

申し訳ありませんGjorgji、私はあなたを信じていません。 'items'配列の内容を記録する前に' getJSON'コールバックメソッドが起動するまで待っていますか? – sje397

+0

私は質問を理解できませんが、私が言う必要があることが1つあります。チェックNo.1のアラートのコメントを外すと、item.manufacturerに正しい値が得られます。チェック・No.2のアラートのコメントを外すと、item.manufacturerの「未定義」となり、getJSONコードの内側でも外側でも問題ありません。 –

関連する問題