gpt4 book ai didi

javascript - 为什么 Promise 构造函数需要一个执行器?

转载 作者:可可西里 更新时间:2023-11-01 02:57:07 25 4
gpt4 key购买 nike

使用 Promises 时,为什么不能在代码库的其他地方定义 resolvereject 的触发器?

我不明白为什么 resolvereject 逻辑应该在声明 promise 的地方进行本地化。这是一种疏忽,还是强制使用 executor 参数有好处?


我认为 executor 函数应该是可选的,它的存在应该决定 promise 是否封装了 resolution。如果没有这样的授权, promise 将更具可扩展性,因为您不必立即启动异步。 promise 也应该是可重置的。这是一个单次切换,1 或 0,resolve()reject()。可以附加大量并行和顺序结果:promise.then(parallel1)promise.then(parallel2) 以及 promise.then( seq1).then(seq2) 但是有引用权限的玩家不能解析/拒绝 INTO 切换

您可以稍后构建结果树,但不能更改它们,也不能更改根(输入触发器)

老实说,顺序结果树也应该是可编辑的。假设你想拼接出一个步骤并做其他事情,在你声明了许多 promise 链之后。重构 promise 和每个顺序函数没有意义,尤其是因为您甚至不能拒绝或破坏 promise ...

最佳答案

这叫做 the revealing constructor pattern由 Domenic 创造。

基本上,这个想法是让您在对象尚未完全构建时访问对象的部分。引用多梅尼克的话:

I call this the revealing constructor pattern because the Promise constructor is revealing its internal capabilities, but only to the code that constructs the promise in question. The ability to resolve or reject the promise is only revealed to the constructing code, and is crucially not revealed to anyone using the promise. So if we hand off p to another consumer, say

过去

最初,promises 与延迟对象一起工作,这在 JavaScript promises 起源的 Twisted promises 中是正确的。在 Angular 的 $q、Q、jQuery 等旧实现中仍然如此(但经常被弃用)和旧版本的 bluebird 。

API 是这样的:

var d = Deferred();
d.resolve();
d.reject();
d.promise; // the actual promise

它成功了,但它有一个问题。 Deferred 和 promise 构造函数通常用于将非 promise API 转换为 promise。 JavaScript 中有一个“著名”问题,称为 Zalgo - 基本上,这意味着 API 必须是同步的或异步的,但不能同时是两者。

问题是 - 使用 deferreds 可以做类似的事情:

function request(param) {
var d = Deferred();
var options = JSON.parse(param);
d.ajax(function(err, value) {
if(err) d.reject(err);
else d.resolve(value);
});
}

这里有一个隐藏的微妙错误 - 如果 param 不是有效的 JSON,此函数将同步抛出,这意味着我必须将每个 promise 返回函数包装在} catch (e) { 和一个 .catch(e => 来捕获所有错误。

promise 构造函数捕获此类异常并将它们转换为拒绝,这意味着您永远不必担心同步异常与带有 promise 的异步异常。 (它始终在“下一个滴答”中执行 then 回调,从而在另一端保护您)。

此外,它还需要一个额外的类型,每个开发人员都必须了解 promise 构造函数不具备的地方,这非常好。

关于javascript - 为什么 Promise 构造函数需要一个执行器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37651780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com