Coinbase API большие отклики и медленные - PullRequest
0 голосов
/ 28 июня 2018

Следующий код обрабатывается за 5-10 секунд (есть 5 вызовов API). Это не пригодно для использования, как это. Является ли медленный ответ моей ошибкой или Coinbase API просто медленный и большой?

app.get('/buys', async (req, res) => {
    const buys = await getAllBuys()
    res.json(buys)
})

const fetchAllAccounts = () => {
    return new Promise(
        (resolve, reject) => {
            coinbase.getAccounts(null, (err, accounts) => {
                if (err) {
                    reject(err)
                }
                else{
                    resolve(accounts)
                }
            })
        }
    )
}

const fetchAllBuys = (account) => {

    return new Promise(
        (resolve, reject) => {
            account.getBuys(null, (err, buys) => {
                if (err) {
                    reject(err)
                }
                else{
                    resolve(buys)
                }
            })
        }
    )
}


const getAllBuys = async () => {
    const accounts = await fetchAllAccounts()

    let combinedBuys = []

    for (let account of accounts) {
        const buys = await fetchAllBuys(account)
        combinedBuys = [...combinedBuys, ...buys]
    }
    //console.log(combinedBuys)
    return combinedBuys
}

Response - это массив с элементами, которые включают информацию об учетной записи, такую ​​как сертификаты и так далее.

1 Ответ

0 голосов
/ 29 июня 2018

Хорошо, это был мой код. В приведенном выше коде я жду завершения каждого запроса, прежде чем запустить новый. Что приводит к ненужной задержке. С помощью метода Promise.all мы можем генерировать все обещания и разрешать их одновременно. Посмотрите на переработанный код ниже.

app.get('/buys', async (req, res) => {
    console.time('[/buys]');

    const promises = await getAllBuys()
    const buys = await Promise.all(promises)
    res.json(buys)

    console.timeEnd('[/buys]');
})


const fetchAllAccounts = () => {
    return new Promise(
        (resolve, reject) => {
            coinbase.getAccounts(null, (err, accounts) => {
                if (err) {
                    reject(err)
                }
                else{
                    resolve(accounts)
                }
            })
        }
    )
}

const fetchAllBuys = (account) => {

    return new Promise(
        (resolve, reject) => {
            account.getBuys(null, (err, buys) => {
                if (err) {
                    reject(err)
                }
                else{
                    resolve(buys)
                }
            })
        }
    )
}


const getAllBuys = async () => {
    const accounts = await fetchAllAccounts()

    let promises = []

    for (let account of accounts) {
        promises.push(fetchAllBuys(account))
    }
    return promises
}

От 2,5 / 3 секунд до 0,8 / 1 секунд.

...