尽管在其他地方取得了成功,但异步对象并未从getInitialProps返回

时间:2018-05-22 18:53:03

标签: javascript reactjs async-await nextjs

我刚开始通过汇总来自不同部分和在线课程的一些代码来弄清React。

我正在使用React,Next和Axios从加密货币服务器获取API。

我面临的主要问题是:

  • 我能够在getInitialProps下调试console.log(coinObjects),并正确显示对象
  • 尽管如此,coinObjects 不会在{this.props.coinObjects}中呈现
  • 作为一种可能的线索,linksArr 会在{this.props.linksArr}中呈现

我的代码如下:

    class MainIndex extends Component {
    static async getInitialProps(props) {
        // setup - empty array and list of coins
        const coinList = ["NEO", "ETH", "BTC"];
        const numCoins = coinList.length;
        const coinObjects = [];
        const linksArr = [];
        const isServer = typeof window === "undefined";

        // API GET
        const baseUrl = "https://min-api.cryptocompare.com/data/histohour?";
        for (let coinName of coinList) {
        linksArr.push(
            baseUrl.concat("fsym=", coinName, "&tsym=", "USD", "&limit=", "3")
        );
        }

        const getObj = async linksArr => {
        try {
            let res = await axios.all(linksArr.map(l => axios.get(l)));
            for (let i = 0; i < linksArr.length; i++) {
            coinObjects[coinList[i]] = res[i].data.Data;
            }
        } catch (err) {
            console.error(err);
        }
        };
        await getObj(linksArr);
        console.log(coinObjects);

        // Return updated arrays
        if (isServer) {
        return { coinObjects, numCoins, linksArr };
        } else {
        return {};
        }
    }

    render() {
        return (
        <Layout>
        <h2>
          CoinObject has {this.props.coinObjects.length} coins
          // Returns 0
          <br />
          LinksArr has {this.props.linksArr.length} links
          // Returns 3
        </h2>
        </Layout>
        );
    }
    }

有人可以帮帮我吗?我已经用尽所有谷歌搜索,Stackoverflow发布和编码我能找到的朋友(只有1)。我无法弄清楚出了什么问题,我希望这不是一个愚蠢的问题,因为我一直在调整和改变事情,但还没有弄明白什么是错的。

1 个答案:

答案 0 :(得分:0)

此处coinObject设置为数组:

const coinObjects = [];

但后来被视为对象:

coinObjects[coinList[i]] = res[i].data.Data;

这意味着你想要像这样添加到数组中:

for (let i = 0; i < linksArr.length; i++) {
  let data = res[i].data.Data;
  let name = coinList[i];

  coinObjects.push({ name: name, data: data });
}