使用Promises时,为什么不能在代码库的其他地方触发resolve并reject定义?
resolve
reject
我不明白为什么resolve,reject应该在声明诺言的地方本地化逻辑。这是疏忽大意,还是强制执行此executor参数有好处吗?
executor
我相信执行程序功能应该是可选的,并且它的存在应该确定promise是否封装了解决方案。没有这样的授权,promise的可扩展性就更大,因为您不必立即启动异步。承诺也应该是可重置的。这是1档开关,1或0 resolve()或reject()。可以附加许多平行和顺序的结果:promise.then(parallel1)而且promise.then(parallel2),具有promise.then(seq1).then(seq2)参考特权的参与者也无法解决/拒绝进入这一转变
resolve()
reject()
promise.then(parallel1)
promise.then(parallel2)
promise.then(seq1).then(seq2)
您可以在以后构建结果树,但不能更改结果,也不能更改根(输入触发器)
老实说,顺序结果树也应该是可编辑的..说您想在声明了许多许诺链之后拼接一个步骤,然后执行其他操作。重建诺言和每个顺序函数是没有意义的,尤其是因为您甚至不能拒绝或破坏诺言。
这称为Domenic创造的揭示构造器模式。
基本上,这个想法是让您访问尚未完全构造的对象的 各个部分 。报价Domenic:
我之所以称其为揭示性构造函数模式,是因为Promise构造函数正在揭示其内部功能,但仅揭示了构造有问题的promise的代码。解决或拒绝诺言的能力只会显示给构建代码,而至关重要的是不会透露给使用诺言的任何人。因此,如果我们将p交给另一个消费者,说
最初,promise与延迟对象一起使用,在源自JavaScript的Promise的Twistedpromises中是正确的。在较旧的实现中(例如Angular $q,Q,jQuery和bluebird的旧版本),这仍然是正确的(但通常已弃用)。
$q
API类似于:
var d = Deferred(); d.resolve(); d.reject(); d.promise; // the actual promise
它有效,但是有问题。Deferreds和Promise构造函数通常用于将非Promise API转换为Promise。JavaScript中存在一个称为“Zalgo”的“著名”问题-基本上,这意味着API必须是同步或异步的,但绝不能同时存在。
事情是-递延可以执行类似的操作:
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返回函数都包装在a} catch (e) {和a中,.catch(e =>以捕获所有错误。
param
} catch (e) {
.catch(e =>
promise构造函数捕获此类异常并将其转换为拒绝,这意味着您不必担心同步异常与带有Promise的异步异常。(它通过始终then在“下一个刻度”中执行回调来从另一方面保护您)。
then
此外,它还需要每个开发人员都必须了解一种额外的类型,以了解promise构造函数不擅长的地方。