JavaScript Promises:将 Promise 与非 Promise 对象链接起来。为啥它有效?

Posted

技术标签:

【中文标题】JavaScript Promises:将 Promise 与非 Promise 对象链接起来。为啥它有效?【英文标题】:JavaScript Promises: chaining promises with non-promise objects. Why it works?JavaScript Promises:将 Promise 与非 Promise 对象链接起来。为什么它有效? 【发布时间】:2017-10-16 07:28:13 【问题描述】:

我正在了解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() 调用返回一个 Promise,它通过 Response 解析 与资源获取操作关联的对象。

好吧,既然fetch() 返回一个Promise 对象,我可以理解第一个then() 调用工作正常,因为Promise 对象has this method。但是链式调用中返回的 Response 对象不是 Promise 对象。但是第二次调用then() 方法有效!

更改虚拟示例在第一个 console.log() 中打印 undefined

fetch(".")
.then(function(response)  // first then() call
    console.log(response.then)
    return response;
).then(function(response)  // second then() call
    console.log("ok");
);

我的问题是:为什么会这样?由于返回的对象没有此方法,第二次调用 then() 是如何工作的?它是一种语法糖吗?

谢谢!

【问题讨论】:

“由于返回的对象没有这个方法,所以第二次调用 then() 是如何工作的?” - .then() 函数调用自身立即发生,每个返回一个promise 对象,它们不依赖于链中的前一个回调,返回带有 .then() 方法的东西。 为了支持@nnnnnn,这里:***.com/a/27716518/4279440 很好地解释了这种行为。 【参考方案1】:

但是在链式调用中返回的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 作为承诺,这确实是行不通的。

【讨论】:

很好的答案!谢谢! :)

以上是关于JavaScript Promises:将 Promise 与非 Promise 对象链接起来。为啥它有效?的主要内容,如果未能解决你的问题,请参考以下文章

返回promises的Javascript顺序函数

JavaScript 中的 Promises/Fetch:如何从文本文件中提取文本

javascript PROMISES - 订购购物清单

javascript 使用Promises复制JS目录

Javascript Promises

javascript 灵活的AJAX jQuery使用promises