Получение данных в цикле от обещания Axios - PullRequest
0 голосов
/ 28 июня 2019

У меня много данных, которые нужно сравнить с некоторыми удаленными данными, а затем сохранить. Очень простой пример ...

Массив:

[
  {
    "title" : "My title",
    "key": 12345
  },
  {
    "title" : "Some other title",
    "key": 54321
  },
...
] 

Функция, которая обрабатывает каждый из объектов из массива, и другая функция, которая проверяет, существует ли ключ перед сохранением.

for(let v of array){
  myFunction(v);
}

const myFunction = async (val) => {
  const {title, key} = val;

  const options = {
   "url": `https://apicall.com/${key}` 
   "method": "POST",
   ...
  }

  const myVar = await anotherFunction(options)
  console.log(myVar)

  //compare remote and local data here
  //then proceed accordingly 

  ...
}

const anotherFunction = async (options) => {
  return await axios(options).catch(error=>console.log(error))
}

Мне нужно это значение из axios, прежде чем продолжить, но я не могу заставить его работать синхронно. Какой лучший способ сделать что-то подобное?

1 Ответ

0 голосов
/ 28 июня 2019

Хорошо, насколько я понял, у вас есть некоторые локальные данные и некоторые удаленные данные. Вы сравните как данные по критериям даты, так и удаленный элемент, дата которого отличается от даты локального элемента, и обновите этот локальный элемент.

С учетом следующих локальных данных .

[
  {
    "title" : "My title",
    "key": 12345,
    "date": "25-06-2019" 
  },
  {
    "title" : "Some other title",
    "key": 54321,
    "date": "26-06-2019"
  },
  {
    "title" : "Yet Some other title",
    "key": 98765,
    "date": "27-06-2019"
  }
] 

Удаленные данные

let remoteData = [
    {
        "title": "My title",
        "key": 12345,
        "date": "28-06-2019"
    },
    {
        "title": "Some other title",
        "key": 54321,
        "date": "29-06-2019"
    },
    {
        "title": "Yet Some other title",
        "key": 98765,
        "date": "27-06-2019"
    },
    {
        "title": "Also Yet Some other title",
        "key": 47289,
        "date": "30-06-2019"
    }
]

Итак, моя реализация будет следующей

let localData = [
  {
    "title" : "My title",
    "key": 12345,
    "date": "25-06-2019" 
  },
  {
    "title" : "Some other title",
    "key": 54321,
    "date": "26-06-2019"
  },
  {
    "title" : "Yet Some other title",
    "key": 98765,
    "date": "27-06-2019"
  }
] ;

const getRemoteData = async() {
  try {
    const response = await Axios.get('api_url')
    return response;
  } catch(err) {
    throw err
  }
}

const someFunction = async() {
  try {
    let remoteData = await getRemoteData()
    localData = compareData(remoteData, localData)
    // process with updated localData
  } catch(err) {
    handleError(err)
  }
}

const compareData = (remoteData, localData) => {
    let data = remoteData.map((remote_element) => {
        for(let i = 0; i < localData.length; i++) {
            let local_element = localData[i];
            if (local_element.key === remote_element.key) {
                if (local_element.date === remote_element.date) {
                    return local_element; // no need to update.
                } else {
                    return remote_element; // found diff dates. Update local data.
                }
            }
        }
        return remote_element; // Found new remote element insert into localData.
    })
    return data
}

Вывод будет сочетанием как обновленных данных, так и локальных данных.

[
    {
        "title": "My title",
        "key": 12345,
        "date": "28-06-2019"
    },
    {
        "title": "Some other title",
        "key": 54321,
        "date": "29-06-2019"
    },
    {
        "title": "Yet Some other title",
        "key": 98765,
        "date": "27-06-2019"
    },
    {
        "title": "Also Yet Some other title",
        "key": 47289,
        "date": "30-06-2019"
    }
]

Дайте мне знать, если это так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...