Javascript asyn c await не работает в операторе if - PullRequest
1 голос
/ 17 марта 2020

Я не могу понять, почему следующее Javascript asyn c await не работает.

async function fetchDataAndComputeSomething (ids) {
  let response
  if (ids && ids.length > 0) {
    // ids specified, fetch some data with same ids from service.
    response = await fetchDataWrapper (ids)
    console.log('IfBlockResponse = ' + JSON.stringify(response, null, 4))
    // do something specific with response data here.
  } else {
    // ids not specified, use null to get all data from service.
    response = await fetchDataWrapper (null)
    console.log('ElseBlockResponse = ' + JSON.stringify(response, null, 4))
    // do something different with response data here.
  }
}

async function fetchDataWrapper (ids) {
  let dicToReturn = {}

  const responseData = await actualFetchDataMethod(ids)
  for (let i = 0; i < responseData.length; i++) {
    let responseItem= responseData[i]
    dicToReturn [responseItem.id] = responseItem
  }
  return dicToReturn 
}

, но это нормально.

async function fetchDataAndComputeSomething (ids) {
  let response
  if (ids && ids.length > 0) {
    // ids specified, fetch some data with same ids from service.
    response = await fetchDataWrapper (ids)
  } else {
    // ids not specified, use null to get all data from service.
    response = await fetchDataWrapper (null)
  }

  console.log('Response = ' + JSON.stringify(response, null, 4))
  if (something) {
    // do something specific with response data here.
  } else {
    // do something different with response data here.
  }
}

async function fetchDataWrapper (ids) {
  let dicToReturn = {}

  const responseData = await actualFetchDataMethod(ids)
  for (let i = 0; i < responseData.length; i++) {
    let responseItem= responseData[i]
    dicToReturn [responseItem.id] = responseItem
  }

  return dicToReturn 
}

Первый пример: ответ - это словарь моих ожидаемых ключей, но значения равны нулю. Во втором примере ответ представляет собой словарь моих ожидаемых ключей и ожидаемых значений.

Каким-то образом, когда код находится в том же блоке if, он получает неправильное значение. Но если я помещу код вне блока if, он будет ждать реальных данных. Как вы можете видеть, я должен продублировать условие if, поэтому logi c может быть запущен вне блока if, содержащего ожидание. Я могу сделать это как обходной путь, но я не знаю точно, почему первый пример не работает.

...