使用Javascript时出现未知错误

使用Javascript时出现未知错误,javascript,ecmascript-6,es6-promise,ecmascript-5,Javascript,Ecmascript 6,Es6 Promise,Ecmascript 5,我不熟悉Javascript,并且试图理解承诺是如何工作的。我编写了以下代码来调用RESTAPI并解析响应 const buyFlightTicket = () => { return new Promise( (resolve, reject) => { setTimeout( () => { let commentResponse = fetch('https://jsonplaceholder.typicode.com/co

我不熟悉Javascript,并且试图理解承诺是如何工作的。我编写了以下代码来调用RESTAPI并解析响应

const buyFlightTicket = () => {
    return new Promise( (resolve, reject) => {
        setTimeout( () => {
            let commentResponse = fetch('https://jsonplaceholder.typicode.com/comments/1'); 
            commentResponse
                .then(response => {
                    if (response.status == 200) {
                        resolve(response.json());
                    } else {
                        reject("Failed to fetch comment: " + response.statusText);
                    }
                })
                .reject("Failed to fetch comment");
        }, 3000);
    })
}

buyFlightTicket()
.then( (responseData) => console.log(responseData))
.catch( (error) => console.log(error));
我能够记录响应数据,但在将响应记录到控制台之前出现错误:未知错误

是什么导致了这个错误


另外,如何在不使用Promise的情况下使用回调重写此代码?

您应该使用
捕获
,而不是
。拒绝

            commentResponse
                .then(response => {
                    if (response.status == 200) {
                        resolve(response.json());
                    } else {
                        reject("Failed to fetch comment: " + response.statusText);
                    }
                })
                .catch(() => "Failed to fetch comment");


您可以使用fetch,它还返回一个承诺

const buyFlightTicket = () => {
    let commentResponse = fetch('https://jsonplaceholder.typicode.com/comments/1'); 
    return commentResponse
        .then(response => {
            if (response.status == 200) {
                return (response.json());
            } else {
                return new Error("Failed to fetch comment: " + response.statusText);
            }
        })
}

buyFlightTicket()
.then( (responseData) => console.log(responseData))
.catch( (error) => console.log(error));
如果浏览器不支持
Promise
,则可以添加
polyfill
或使用xhr

    var buyFlightTicket = function(cb, errorCb) {
        var xhr = new XMLHttpRequest();
        xhr.open('GET', 'https://jsonplaceholder.typicode.com/comments/', true);
        xhr.onreadystatechange = function() {
            if (xhr.readyState === 4){
                if (xhr.status === 200){
                  cb(xhr.responseText)
                } else {
                  errorCb(xhr.statusText);
                }
            }
        };


        xhr.send(null);
        xhr.onerror = function (e) {
            console.error(xhr.statusText);
        };
        console.log('end')
    }
    buyFlightTicket(successCb, errorCb)
    function successCb(res) {
        console.log(res);
    }
    function errorCb(err) { console.log(err) }

我认为您必须使用.catch(“无法获取评论”)而不是.reject(“无法获取评论”)。@soltex谢谢。我在发帖子后发现了这一点。避开这个!在
setTimeout
之后立即
解析
,并将其余部分放入
然后
回调中。“如何使用回调重写此代码而不使用承诺?”-为什么要这样做?另外,这是不可能的,因为
fetch
返回一个你必须使用的承诺。@Bergi如果没有反模式,你能告诉我如何重新编写这个吗?你能帮助我如何重新编写同样的逻辑而不使用承诺吗?如何在ES5中通过回调实现这一点?是的,您可以使用fetch,它还返回一个承诺。我在另一个答案中加上它