使用Fetch返回的Promise不响应.then()

时间:2019-11-03 09:12:49

标签: javascript asynchronous

我在这里有点困惑,某些异步代码的这一部分无法正常工作。问题出在这里:

export async function active() {
    return new Promise(function(resolve,reject){
        fetch("https://api.spotify.com/v1/me", { //omitted headers to keep it clean
        }).then(response => console.log(response)) <-- This code runs, and will log a response
        .then(data => function(){ <-- but this won't
            console.log("This won't run either")
            if (data.status == 200) {
                console.log(true)
                resolve(data)
            } else {
                console.log(false)
                reject(data)
            }
        })
    })
}

为什么第二部分没有运行?抱歉,我对异步/等待有点陌生

1 个答案:

答案 0 :(得分:5)

那里有一些问题

  1. .then(data => function(){传递一个函数,该函数将一个函数返回到.then中。您需要 箭头功能 function关键字,但不要同时使用两者。由于您要做的只是返回一个函数(什么都没有调用),因此您看不到该函数的内容运行。摆脱其中的function()部分。

  2. 在该代码中没有理由new Promise(也没有理由将功能设为async),只需使用fetch中的promise链即可。 (更多here。)

  3. 您的第一个then处理程序返回undefined,因为您要返回console.log的结果。

  4. 您的代码使用名称data,在那里您仍在处理尚未读取其正文的Response对象。您可能想通过.text().json()或其他类似的正文读取方法来读取正文。

相反:

export function active() {
    return fetch("https://api.spotify.com/v1/me", { //omitted headers to keep it clean
    })
    .then(response => {
        if (!repsonse.ok) {
            throw new Error("HTTP status " + response.status);
        }
        return response.text(); // or `.json()` or several others, see #4 above
    });
}

请注意,我在那里略微更改了对成功的检查。