我正在了解JavaScript Fetch API,我对Promises有点疑惑。
考虑这个打印" ok"在控制台中:
fetch(".")
.then(function(response) { // first then() call
return response;
}).then(function(response) { // second then() call
console.log("ok");
});
有关Fetch API的Response Object的页面显示:
fetch()调用返回一个承诺,它与Response一起解析 与资源获取操作关联的对象。
好吧,因为fetch()
返回一个Promise对象,我可以理解第一个then()
调用工作正常,因为Promise对象has this method。但链接调用中返回的Response对象不是Promise对象。但是第二次调用then()
方法有效!
更改虚拟示例会在第一个undefined
中打印console.log()
:
fetch(".")
.then(function(response) { // first then() call
console.log(response.then)
return response;
}).then(function(response) { // second then() call
console.log("ok");
});
我的问题是:为什么会这样?由于返回的对象没有此方法,第二次调用then()
的工作原理如何?它是一种语法糖吗?
谢谢!
答案 0 :(得分:8)
但链接调用中返回的
Response
对象不是Promise对象。但是第二次调用then()
方法有效!
是的,因为第二次.then()
调用是第一个then
调用的返回值,而不是响应。 promise then
method总是returns a promise - 这使它可以链接。它确实不返回异步回调的返回值 - 因为它需要查看未来。
仔细观察:
const promise1 = fetch(".");
const promise2 = promise1.then(function(response) { // first then() call
return response;
});
const promise3 = promise2.then(function(response) { // second then() call
console.log("ok");
});
不是
fetch(".").then(function(response) { // outer then() call
return response.then(function() { // inner then() call
console.log("ok");
});
});
如果没有response
作为承诺,它确实无效。