Aurelia машинопись загрузка службы JSON

Я пытаюсь создать класс, который будет иметь две функции: 1) Загрузить элементы из json, хранящиеся на моем локальном сервере, и вернуть эту переменную со всеми элементами. 2) Вернуть один элемент по идентификатору. Проблема в том, что я хочу использовать эти два метода из разных модулей, и я не знаю, как реализовать модуль и использовать его. До сих пор я был в состоянии реализовать часть http с помощью клиента извлечения aurelia, но я не знаю, как сделать функцию:

function getItems() {
   // some http request code
   return fetchedItems;
}

Поскольку код в aurelia.io делает что-то вроде этого (что я пробовал и на самом деле работает, если я печатаю данные):

import 'fetch';
import {HttpClient} from "aurelia-fetch-client";

export function getItems(url) {
    let client = new HttpClient();
    client.configure(config => {
      config
        .withBaseUrl('api/')
        .withDefaults({
          credentials: 'same-origin',
          headers: {
            'Accept': 'application/json',
            'X-Requested-With': 'Fetch'
          }
        })
        .withInterceptor({
          request(request) {
            console.log(`Requesting ${request.method} ${request.url}`);
            return request;
          },
          response(response) {
            console.log(`Received ${response.status} ${response.url}`);
            return response;
          }
        });
    });

    client.fetch(url)
      .then(response => response.json())
      .then(data => {
        console.log(data);
      });
  }

Все это работает хорошо. Дело в том, что вместо 'console.log(data);' Я хочу вернуть его, но пока единственное, что, похоже, работает, - это присвоение возвращаемых элементов локальной переменной класса с помощью this.items = data. Я был бы в порядке с этим, пока я получаю функцию, которая позволяет сделать это:

let items = getItems();

А также

let item = getItemById(id);

РЕДАКТИРОВАТЬ: РЕШЕНО

Пользователи должны заметить, что для того, чтобы это работало, они должны иметь это в своем файле tsconfig.js:

"target": "es6"

Потому что async/await требует как минимум ES2015.

2 ответа

Решение

использование async / await

Если вы используете TypeScript и ориентируетесь на ES6, вы можете использовать await/async ключевые слова.

export async function getItems(url) {
    let client = new HttpClient();
    client.configure(config => {
      config
        .withBaseUrl('api/')
        .withDefaults({
          credentials: 'same-origin',
          headers: {
            'Accept': 'application/json',
            'X-Requested-With': 'Fetch'
          }
        })
        .withInterceptor({
          request(request) {
            console.log(`Requesting ${request.method} ${request.url}`);
            return request;
          },
          response(response) {
            console.log(`Received ${response.status} ${response.url}`);
            return response;
          }
        });
    });

    return await client.fetch(url)
      .then(response => response.json());

}

client.fetch возвращает обещание, поэтому вам просто нужно его вернуть:

return client.fetch(url)
   .then(response => response.json());

Чтобы использовать функцию:

getItems(url)
  .then(data => this.someProperty = data);
Другие вопросы по тегам