1

我正在尝试将一些数据从 React Native 上传到服务器。数据存储在 AsyncStorage 中。

数据如下:

let vehicles = [
  {
    "id": 1,
    "make_text": "Peugeot",
    "model_text": "208",
    "color_text": "Argent",
    "category_text": "CT",
    "tag_text": "",
    "vin": "123456",
    "registration": "",
    "reference": "",
    "comment": "",
    "autralis_id": 151390
  },
  {
    "id": 1,
    "make_text": "Peugeot",
    "model_text": "307",
    "color_text": "Bleu",
    "category_text": "CT",
    "tag_text": "",
    "vin": "654321",
    "registration": "",
    "reference": "",
    "comment": "",
    "autralis_id": 156413
  }
]

let vehicle_slots = [
  {
    "vehicle_id": 1,
    "slot_id": 118,
    "area": "",
    "zone": "B",
    "aisle": "",
    "side": "S",
    "col": 2,
    "level": 0,
    "position": 0,
    "timestamp": "201705021544",
    "picturepath": "",
    "pictureguid": "0a016bb9-b7bb-4dd7-a0bf-407ef31a0c1a",
    "reason": "ENTER",
    "handled": 0,
    "uploaded": 0
  },
  {
    "vehicle_id": 1,
    "slot_id": 2521,
    "area": "",
    "zone": "C",
    "aisle": "",
    "side": "E",
    "col": 4,
    "level": 0,
    "position": 0,
    "timestamp": "201705021544",
    "picturepath": "",
    "pictureguid": "64c726e2-37ec-4ab7-8b57-b08e9899086a",
    "reason": "ENTER",
    "handled": 0,
    "uploaded": 0
  }
]

我只想发送那些具有uploadedhandled属性等于0的人。

uploaded因此,首先我得到那些handled属性等于 0 的值。我这样做如下:

try {
  let vehicle_data = await AsyncStorage.getItem('vehicle');
  if (vehicle_data !== null){
    // We have data!!
    let vehicle_slot_data = await AsyncStorage.getItem('vehicle_slot');
    if (vehicle_slot_data !== null){
      vehicle_data = JSON.parse(vehicle_data);
      vehicle_slot_data = JSON.parse(vehicle_slot_data);

      let result_to_handle = [];
      let result_to_upload = [];

      vehicle_slot_data.forEach(v => {
        let not_handled = vehicle_data.find(m => m.id === v.vehicle_id && v.handled === 0);
        let not_uploaded = vehicle_data.find(m => m.id === v.vehicle_id && v.uploaded === 0);

        if ( not_uploaded ) result_to_upload.push(that.renderData(v, not_uploaded)[0]);
        if ( not_handled ) result_to_handle.push(that.renderData(v, not_handled)[0]);

      });

      //Here I have result_to_handle and result_to_upload with the data that I need to send to the server.

      ............

如果result_to_handle并且result_to_uploadlength > 0那么我想将它们发送到服务器并在 AsyncStorage 中将属性handled和属性更新uploaded1

我尝试按如下方式进行:

..............

if (result_to_handle.length > 0){
  let options = {
    method: 'POST',
    body: JSON.stringify(result_to_handle),
    headers: {
      'Content-Type': 'application/json',
      'Accept': 'application/json'
    }
  };
  fetch(data_url + "/manager/transport/sync/movements/", options)
    .then(response => response.json())
    .then(responseData => {
    AsyncStorage.getItem('vehicle_slot')
      .then(json => {
      let data = [];
      if (json) data = JSON.parse(json);
      let result = [];
      forEach(data, value => {
        if( value.handled === 0 ){
          value.handled = 1;
          result.push(value);
        }else{
          result.push(value);
        }
      });

      AsyncStorage.setItem('vehicle_slot', JSON.stringify(result))
    });
  });
}

if (result_to_upload.length > 0){
  forEach(result_to_upload, value => {
    if (value.picturepath) {
      let body = new FormData();
      const photo = {
        uri: value.picturepath,
        type: 'image/jpeg',
        name: value.pictureguid + '.jpg',
      };
      body.append('image', photo);
      let xhr = new XMLHttpRequest();
      xhr.open('POST', data_url + "/manager/transport/sync/picture/?pictureguid=" + value.pictureguid);
      xhr.onload = (e) => {
        if (xhr.readyState === 4) {
          if (xhr.status === 200) {

            AsyncStorage.getItem('vehicle_slot')
              .then(json => {
              if (json){
                let data = JSON.parse(json);
                let result_data = [];
                forEach(data, val => {
                  if( val.pictureguid === value.pictureguid ){
                    val.uploaded = 1;
                    result_data.push(val);
                  }else{
                    result_data.push(val);
                  }
                });
                AsyncStorage.setItem('vehicle_slot', JSON.stringify(result_data), () => s_cb())
              }
            });

          }
        }
      };
      xhr.onerror =  (e) => console.log('Error');
      xhr.send(body);
    } else {
      AsyncStorage.getItem('vehicle_slot')
        .then(json => {
        if (json){
          let data = JSON.parse(json);
          let result_data = [];
          forEach(data, val => {
            if( val.pictureguid === value.pictureguid ){
              val.uploaded = 1;
              result_data.push(val);
            }else{
              result_data.push(val);
            }
          });
          AsyncStorage.setItem('vehicle_slot', JSON.stringify(result_data), () => s_cb())
        }
      });
    }
  });
}

但是我得到的结果是不正确的。

来自 AsyncStorage的vehicle_slot内容如下:

[
  {
    "vehicle_id": 1,
    "slot_id": 118,
    "area": "",
    "zone": "B",
    "aisle": "",
    "side": "S",
    "col": 2,
    "level": 0,
    "position": 0,
    "timestamp": "201705021544",
    "picturepath": "",
    "pictureguid": "0a016bb9-b7bb-4dd7-a0bf-407ef31a0c1a",
    "reason": "ENTER",
    "handled": 1,
    "uploaded": 0
  },
  {
    "vehicle_id": 1,
    "slot_id": 2521,
    "area": "",
    "zone": "C",
    "aisle": "",
    "side": "E",
    "col": 4,
    "level": 0,
    "position": 0,
    "timestamp": "201705021544",
    "picturepath": "",
    "pictureguid": "64c726e2-37ec-4ab7-8b57-b08e9899086a",
    "reason": "ENTER",
    "handled": 1,
    "uploaded": 1
  }
]

因此,第一个对象的值uploaded仍然等于 0,但它应该等于 1。

有什么建议吗?

4

0 回答 0