Асинхронная функция не ждет ожидания - PullRequest
0 голосов
/ 19 октября 2018

У меня есть много асинхронных функций, где я импортирую json из файла и затем устанавливаю поля.У меня есть ожидание для импорта JSON.Ранее он выполнялся последовательно, ожидая JSON, а затем манипулируя данными.Раньше я использовал Mocha и недавно начал переходить на Jest, когда все мои тесты и функции перестали работать.

Я не уверен, правильно ли я понимаю асинхронные функции.Но раньше это работало нормально, а теперь уже нет.Ниже приведен пример:

async build_transaction_request({reference=util.id_generator(), type="XYZ", amount=25, currency="USD", timestamp=util.timestamp_millis()}={}){
    let transactions = await config_util.get_payload("transactions")
    let x_transaction = transactions.xTransaction
    x_transaction.reference = reference
    x_transaction.type = type
    x_transaction.amount = amount
    x_transaction.currency = currency
    x_transaction.timestamp = timestamp
    return x_transaction
}

Я получаю эту ошибку:

TypeError: Невозможно установить свойство 'reference' из неопределенного

Ниже приведеныдве другие функции:

async load_data(file_path) {
  await delete require.cache[require.resolve(file_path)]
  let data = await require(file_path);
  return data
}

async get_payload(file_name) {
  let payload = await this.load_data(this.root_dir + '/resources/payload/' + file_name + ".json")
  return payload
}

Ниже приведен код из моего теста, который вызывает функцию build_transaction_request:

test('Test xyz returns 201', async() => {
      //......some code.....

      var[instruction, x_transaction, token] = await Promise.all([

          helper.build_instruction_request({
            type: "CURRENCY",
            value: value,
            rate: rate
          }),
          helper.build_transaction_request({
            amount: amount
          }),
          helper.build_token_request(token_id)
      ]);
});

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Итак, я понял проблему.Я изменил способ импортирования JSON.теперь я использую readFileSync (file_path);Проблема ушла сейчас.Поэтому я считаю, что это было связано с доступом к одному и тому же файлу несколькими функциями одновременно.Большое спасибо всем.

0 голосов
/ 20 октября 2018

Проблема в том, что await config_util.get_payload("transactions") возвращает объект после разрешения, в котором либо отсутствует свойство xTransaction, либо оно установлено вручную с помощью undefined.Код взорвется, как только вы попытаетесь использовать свойство со значением undefined, что вы и делаете: x_transaction.reference = reference.Это все равно что сказать: undefined.reference = reference .... Таким образом, это тот момент, когда код развивается.Вы не можете присвоить значение чему-то, что не существует в памяти.

Ваш get_payload просто разрешает обещание и возвращает этот результат, основываясь на некотором пути к файлу, который вы указали для load_data,

Вы смотрели на параметр, который вы передаете в load_data?

let payload = await this.load_data(this.root_dir + '/resources  /payload/' + file_name + ".json")

У вас есть пробел для одного, так что, вероятно, это не правильно.Что бы вы там ни кормили, он не находит джсона ...

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