Как ожидать и вернуть этот массив продуктов из файла JSON - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь вернуть массив таких продуктов.

import * as rp from "request-promise";

const getProducts = async () => {
    const products = []
    await rp.get({
        uri: 'https://www.supremenewyork.com/mobile_stock.json',
        json: true,
    }).then(async data => {
        data['products_and_categories'].new.forEach(async element => {
            await rp.get({
                uri: `https://www.supremenewyork.com/shop/${element.id}.json`,
                json: true,
            }).then(product => {
                products.push(product)
            })
        })
    })
    console.log(products)
    return products
}

getProducts()

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

Ответы [ 3 ]

0 голосов
/ 12 апреля 2019

Вам не хватает некоторых самых базовых понятий асинхронного JavaScript.Я вижу, что вы используете синтаксис async / await.По сути, async / await - лучший синтаксис для Promises.Это обещает с лучшим / более читаемым синтаксисом.async / await был введен, чтобы дать лучший способ кодирования и вырваться из так называемого «ада обратного вызова».Теперь то, что вы делаете здесь - это смешивание обоих этих синтаксисов.Либо используйте async / await, либо используйте синтаксис .then / .catch.Я думаю, что код, написанный ответом Лукаша здесь, идеально подходит для вашей реализации.

0 голосов
/ 12 апреля 2019
var rp = require('request-promise');

const getProducts = async () => {
    try {
        const data = await rp.get({
            uri: 'https://www.supremenewyork.com/mobile_stock.json',
            json: true,
        });
        const promiseArr = [];
        data.products_and_categories.new.forEach(element => {
            const res = rp.get({
                uri: `https://www.supremenewyork.com/shop/${element.id}.json`,
                json: true,
            })
            promiseArr.push(res)
        });
        return Promise.all(promiseArr)
    } catch (err) {

    }
}

(async function () {
    console.log(await getProducts())
})();

0 голосов
/ 12 апреля 2019

Я предлагаю не смешивать async/await с promises

forEach не будет работать с async/await,

Я рефакторинг вашего кода, это должно быть что-то вродеэто

import * as rp from "request-promise";

const getProducts = async () => {

    const data = await rp.get({
        uri: 'https://www.supremenewyork.com/mobile_stock.json',
        json: true,
    })
    const products = await Promise.all(data['products_and_categories'].new.map(async element => {
        return rp.get({
            uri: `https://www.supremenewyork.com/shop/${element.id}.json`,
            json: true,
        })
    }));

    console.log(products)
    return products
}

getProducts()
...