JavaScript承诺:使用非承诺对象链接承诺。为什么会这样?

时间:2017-05-17 02:40:33

标签: javascript promise es6-promise

我正在了解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()的工作原理如何?它是一种语法糖吗?

谢谢!

1 个答案:

答案 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作为承诺,它确实无效。