Асинхронное обещание возвращает неопределенное или обещание с учетом зоны - PullRequest
2 голосов
/ 22 октября 2019

При вызове функции, которая возвращает обещание, возвращается как undefined , если асинхронные операторы не удалены, затем возвращает ZoneAwarePromise, но не содержит данных.

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

Я рассмотрел несколько вопросов стека, которые не ответили на этот вопрос, включая этот вопрос: Async/ Await with Request-Promise возвращает Undefined

При использовании конечной точки REST для извлечения данных console.logs действительно показывает, что данные верны, однако возврат возвращается как неопределенный

     this.allPeople.forEach(async person => {
          const dodString = await this.getRelatedRecords(person); //undefined
    }

Это основная функция, которая возвращает обещание / данные

async getRelatedRecords(person) {
    // function truncated for clarity
    // ...
    //
    console.warn('This async should fire first');
    selPeopleTable.relationships.forEach(relationship => {
    allRelationshipQueries.push(
      arcgisService.getRelatedTableData(
        selPeopleTable.url, [person[oidField.name]], relationship.id, relationship.name),
      );
    });
    await Promise.all(allRelationshipQueries).then(allResults => {
      console.log('Inside the Promise');
      // The Specific node I am looking for
      const data = allResults[1].results.relatedRecordGroups[0].relatedRecords[0].attributes.dod;
    console.log(data); // Shows correctly as the data I am looking for  
    return data;
    }).catch(function(data){
      console.log('there might be data missing', data);
    });
  }

Удаление операторов ASYNC приводит к срабатыванию getRelatedRecords() после содержащей функции и / или возвращению 'ZoneAwarePromise', который не содержит данных,Мне нужно getRelatedRecords() сначала запустить, а затем запустить остальную часть кода.

Я могу предоставить больше фрагментов, если это будет необходимо.

Zone Aware Promise Zone Aware Promise

Когда асинхронные операторы (я думаю) настроены правильно enter image description here

1 Ответ

1 голос
/ 22 октября 2019

Вам также необходимо вернуть это: await Promise.all(allRelationshipQueries).then(allResults => {

await Promise.all(allRelationshipQueries).then(allResults => { console.log('Inside the Promise'); // The Specific node I am looking for const data = allResults[1].results.relatedRecordGroups[0].relatedRecords[0].attributes.dod; console.log(data); // Shows correctly as the data I am looking for<br> return data; })

return в приведенном выше блоке возвращается, но все это находится в области действия функции стрелкиthen(allResults => {, поэтому вам также необходимо вернуть эту функцию следующим образом:

return await Promise.all(allRelationshipQueries).then(allResults => {

Подход № 2. Второй способ - сохранить это в переменной, например так:

let dataToReturn = await Promise.all(allRelationshipQueries).then(allResults => { console.log('Inside the Promise'); // The Specific node I am looking for const data = allResults[1].results.relatedRecordGroups[0].relatedRecords[0].attributes.dod; console.log(data); // Shows correctly as the data I am looking for<br> return data; }).catch(function(data){ console.log('there might be data missing', data); }); return dataToReturn;

...