我正在尝试在使用 fetch API 的异步函数中链接承诺,但它不起作用

I am trying to chain promises in an async function working with fetch API but it does not work

我正在建立一个网站,使用 API 实时显示比特币价格。问题是我试图确定价格是高还是低,所以我为此设置了算法然后是三分之一。 这是我的代码:

async function pageReload() {
    const showPrice = document.getElementById("bitcoin");
    await fetch('********', options)
        .then(response => response.json())
        .then(response => {
            console.log(response);
            let pastValue = parseInt(response["Realtime Currency Exchange Rate"]["8. Bid Price"], 10);
            showPrice.innerHTML = pastValue;
        })
        .then((response) => {
            let pastValue1 = parseInt(response["Realtime Currency Exchange Rate"]["8. Bid Price"], 10);
            let current = null;
            if (current > pastValue1) {
                current = pastValue1;
                console.log('e mai mare');
            } else if (current == pastValue1) {
                current = pastValue1;
                console.log("e egal");

            } else if (current < pastValue1) {

                console.log("current este " + current + ' pastValue este' + pastValue)
                current = pastValue1;
                console.log("e mai mic");
                showPrice.style.color = 'red';
            }
        })


    .catch(err => console.error(err));



}

const timer = setInterval(pageReload, 20000);
setInterval();

起初我把算法放在第二个然后但是两个变量得到相同的数字而不是 'current' 之前得到的数字。 这是我从浏览器收到的错误:

这部分代码:

.then(response => {
    console.log(response);
    let pastValue = parseInt(response["Realtime Currency Exchange Rate"]["8. Bid Price"], 10);
    showPrice.innerHTML = pastValue;
})
.then((response) => {
    let pastValue1 = parseInt(response["Realtime Currency Exchange Rate"]["8. Bid Price"], 10);
    let current = null;
    if (current > pastValue1) {
        current = pastValue1;
        console.log('e mai mare');
    } else if (current == pastValue1) {
        current = pastValue1;
        console.log("e egal");

    } else if (current < pastValue1) {

        console.log("current este " + current + ' pastValue este' + pastValue)
        current = pastValue1;
        console.log("e mai mic");
        showPrice.style.color = 'red';
    }
})

您必须从这部分代码中的第一个 .then() 开始 return response,或者您必须在此处删除第二个 .then(),因为它不需要因为第一个 .then() 中没有异步操作。因为你没有做 return response,所以当你尝试这样做时:

parseInt(response["Realtime Currency Exchange Rate"]["8. Bid Price"]

response 将是 undefined.

此外,您的 current 值总是重置为 null,然后将 pastValuenull 进行比较,结果始终相同。我猜您希望 current 从一个调用保留到下一个调用,以便您可以与之进行比较。为此,您必须在此函数外部声明它,以便它在一次调用到下一次调用后仍然存在。

不混合 await.then() 也简单得多。如果您使用 await,只需使用它而不是 .then(),并使用 try/catch 而不是 .catch()

以下是我的建议:

// declare current here so it is retained from one function call to the next
let current = 0;

async function pageReload() {
    try {
        const showPrice = document.getElementById("bitcoin");
        let response = await fetch('********', options);
        let data = await response.json();
        console.log(data);
        let pastValue = parseInt(data["Realtime Currency Exchange Rate"]["8. Bid Price"], 10);
        showPrice.innerHTML = pastValue;
        if (current > pastValue) {
            console.log('e mai mare');
        } else if (current == pastValue) {
            console.log("e egal");
        } else if (current < pastValue) {
            console.log("current este " + current + ' pastValue este' + pastValue)
            console.log("e mai mic");
            showPrice.style.color = 'red';
        }
        current = pastValue;
    } catch(e) {
        console.log(e);
    }
}

const timer = setInterval(pageReload, 20000);
setInterval();

您的 if/elseif/elseif 似乎还缺少一些逻辑,因为除了最后一个,他们所做的只是在做 console.log()。您不想在那些 if/else 分支中修改页面吗?