Как я могу правильно обработать это обещание?

Поэтому я использую WooCommerce API, чтобы предлагать продукты моего текущего WordPress. Я использую Nestjs для серверной части и Postman для выполнения запросов.

Вот мой контроллер

@Controller('game')
export class GameController {
  constructor(private readonly gameService: GameService) {}

  @Get()
  findAll() {
    this.gameService.test().then((data) => {
      return data;
    });
  }
}

И вот моя служба, где я подключаюсь к WooCommerce API.

import WooCommerce from '../config/woocomerce.config';

@Injectable()
export class GameService implements GameServiceInterface {
  async test() {
    try {
      const response = WooCommerce.get('products');
      response.then((data) => {
        console.info(data.data);
      });
    } catch (err) {
      return `Error! ${err}`;
    }
  }
}

Проблема в том, что когда я консолью регистрирую поле данных обещания, оно работает нормально! Вот вывод

[
gm-commerce-backend |   {
gm-commerce-backend |     id: 10,
gm-commerce-backend |     name: 'Test product',
gm-commerce-backend |     slug: 'test-product',
gm-commerce-backend |     permalink: 'http://wordpress/product/test-product/',    
gm-commerce-backend |     date_created: '2020-12-21T14:27:07',
gm-commerce-backend |     date_modified: '2020-12-21T14:27:14',
gm-commerce-backend |     type: 'simple',
gm-commerce-backend |     status: 'publish',
gm-commerce-backend |     featured: false,
gm-commerce-backend |     catalog_visibility: 'visible',
gm-commerce-backend |     description: '<p>This is a test product for the WooCommerce API connection</p>\n',
gm-commerce-backend |     short_description: '',
gm-commerce-backend |     sku: '',
gm-commerce-backend |     price: '588',
gm-commerce-backend |     regular_price: '2002',
gm-commerce-backend |     sale_price: '588',
gm-commerce-backend |     date_on_sale_from: '',
gm-commerce-backend |     date_on_sale_to: '',
gm-commerce-backend |     price_html: '<del><span class = "woocommerce-Price-amount 
amount"><bdi><span class = "woocommerce-Price-currencySymbol">&#36;</span>2,002.00</bdi></span></del> <ins><span class = "woocommerce-Price-amount amount"><bdi><span class = "woocommerce-Price-currencySymbol">&#36;</span>588.00</bdi></span></ins>',    
gm-commerce-backend |     on_sale: true,
gm-commerce-backend |     purchasable: true,
gm-commerce-backend |     total_sales: 0,
gm-commerce-backend |     virtual: false,
gm-commerce-backend |     downloadable: false,
gm-commerce-backend |     downloads: [],
gm-commerce-backend |     download_limit: -1,
gm-commerce-backend |     download_expiry: -1,
gm-commerce-backend |     download_type: 'standard',
gm-commerce-backend |     external_url: '',
gm-commerce-backend |     button_text: '',
gm-commerce-backend |     tax_status: 'taxable',
gm-commerce-backend |     tax_class: '',
gm-commerce-backend |     manage_stock: false,
gm-commerce-backend |     stock_quantity: null,
gm-commerce-backend |     in_stock: true,
gm-commerce-backend |     backorders: 'no',
gm-commerce-backend |     backorders_allowed: false,
gm-commerce-backend |     backordered: false,
gm-commerce-backend |     sold_individually: false,
gm-commerce-backend |     weight: '',
gm-commerce-backend |     dimensions: { length: '', width: '', height: '' },      
gm-commerce-backend |     shipping_required: true,
gm-commerce-backend |     shipping_taxable: true,
gm-commerce-backend |     shipping_class: '',
gm-commerce-backend |     shipping_class_id: 0,
gm-commerce-backend |     reviews_allowed: true,
gm-commerce-backend |     average_rating: '0.00',
gm-commerce-backend |     rating_count: 0,
gm-commerce-backend |     related_ids: [],
gm-commerce-backend |     upsell_ids: [],
gm-commerce-backend |     cross_sell_ids: [],
gm-commerce-backend |     parent_id: 0,
gm-commerce-backend |     purchase_note: '',
gm-commerce-backend |     categories: [ [Object] ],
gm-commerce-backend |     tags: [],
gm-commerce-backend |     images: [ [Object] ],
gm-commerce-backend |     attributes: [],
gm-commerce-backend |     default_attributes: [],
gm-commerce-backend |     variations: [],
gm-commerce-backend |     grouped_products: [],
gm-commerce-backend |     menu_order: 0,
gm-commerce-backend |     _links: { self: [Array], collection: [Array] }
gm-commerce-backend |   }
gm-commerce-backend | ]

Но в Postman ничего не появляется. Я получаю пустую страницу.

Это вывод почтальона

Чего мне ожидать? Я ожидаю того же результата, что и в моей консоли, но в почтальоне.

Вы, наверное, хотите return это Promise в findAll.

Sergiu Paraschiv 22.12.2020 13:40

Но если я верну свое обещание в свой контроллер, я не смогу выполнить обещание.

Juan Pedro Pont Vergés 22.12.2020 13:42

Что вы подразумеваете под "обработкой"? У вас все еще может быть .then, и все, что вы вернете туда, будет разрешенными данными.

Sergiu Paraschiv 22.12.2020 13:49

так что в моей службе я бы сделал что-то вроде const response = WooCommerce.get('products'); return response;

Juan Pedro Pont Vergés 22.12.2020 13:51

Но тогда вы не ждете обещания. Просто для ясности, вы понимаете, что вы не можете просто return что-то из .then в findAll и ожидать, что это будет возвращаемое значение вызова findAll? findAll необходимо вернуть промис, иначе как вы сможете дождаться его разрешения? В вашем служении вы уже делаете это с response.then. Просто вы не возвращаете это Обещание в findAll...

Sergiu Paraschiv 22.12.2020 13:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
122
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны добавить async, а затем вернуть результат обещания gamsService в Controller.

@Controller('game')
export class GameController {
  constructor(private readonly gameService: GameService) {}

  @Get()
  async findAll() {
    // you also could not add await, nestjs will help you to get the promise value.
    // it'll work with or without adding await.
    return await this.gameService.test()
  }
}

Вам также необходимо вернуть обещание в Service.

import WooCommerce from '../config/woocomerce.config';

@Injectable()
export class GameService implements GameServiceInterface {
  async test() {
    try {
      // return all fields
      return WooCommerce.get('products');
      
      // return only header field
      const config = await WooCommerce.get('products')
      return {
          header: config.header
      }
    } catch (err) {
      return `Error! ${err}`;
    }
  }
}

Примечание: вы могли видеть nesjs - Асинхронность

Это сработало, я читал, что гнездо разрешает обещание, но что, если я хочу получить доступ к определенному полю своих данных, мне не нужны все мои данные .then, я хочу, давайте возьмем в качестве примера: data.header

Juan Pedro Pont Vergés 22.12.2020 14:06

Спасибо!! теперь он работает отлично. Итак, чтобы быть ясным и в учебных целях, в моем контроллере я всегда должен возвращать обещание, верно?

Juan Pedro Pont Vergés 22.12.2020 14:11

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

Jack Yu 22.12.2020 14:14

Другие вопросы по теме