使用 Javascript 承诺时出现未知错误
Unknown Error while using Javascript promises
我是 Javascript 的新手,正在尝试了解 promises 的工作原理。我编写了以下代码来调用 REST API 并解析响应。
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 的情况下使用回调重写此代码?
您应该使用 catch
,而不是 .reject
commentResponse
.then(response => {
if (response.status == 200) {
resolve(response.json());
} else {
reject("Failed to fetch comment: " + response.statusText);
}
})
.catch(() => "Failed to fetch comment");
你可以使用 fetch,它也是 return 一个 promise
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) }
我是 Javascript 的新手,正在尝试了解 promises 的工作原理。我编写了以下代码来调用 REST API 并解析响应。
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 的情况下使用回调重写此代码?
您应该使用 catch
,而不是 .reject
commentResponse
.then(response => {
if (response.status == 200) {
resolve(response.json());
} else {
reject("Failed to fetch comment: " + response.statusText);
}
})
.catch(() => "Failed to fetch comment");
你可以使用 fetch,它也是 return 一个 promise
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) }