术语可能很难。
让我们从承诺/A+规范 https://promisesaplus.com/#promise-states和相应的 ES6 部分 https://262.ecma-international.org/6.0/#sec-promise-objects有3 states:
-
pending- 承诺尚未取值,其结果仍不确定。
-
实现了- 承诺成功得到了结果值“已分配”
-
rejected- 承诺被赋予reason为什么无法获得结果,通常是一个错误。
期限settled是已完成和已拒绝的同义词,意思是任一 - 与待处理相反。
动态动词fulfill and reject描述将状态从待处理更改为已完成或已拒绝。这些转变被称为履行 or 拒绝的承诺。
这些都很容易。现在,resolve是一个不同的野兽。它有时被用作“履行”的同义词,但最好将其理解为将承诺的命运确定为履行或拒绝。这解决(很少:结算)承诺意味着它离开待处理状态。但即使这样也是不准确的 - 问题在于递归本质承诺解决程序:
是的,如果承诺得到解决,甚至可能不知道它是会被履行还是会被拒绝。但这也意味着命运不再是未定的,因为它与我们解决的承诺绑定在一起 - 请注意,您只能解决承诺一次,它不能解决为不同的值(通过调用resolve
/reject
again).
忽略这个特殊情况,resolved承诺通常意味着确定的承诺。
或者,引用ECMAScript 6 规范 https://262.ecma-international.org/6.0/#sec-promise-objects:
一个承诺是解决是否已解决或是否已“锁定”以匹配另一个承诺的状态。尝试解决或拒绝已解决的承诺没有任何效果。一个承诺是未解决的如果没有解决。未解决的 Promise 始终处于待处理状态。已解决的承诺可能悬而未决、履行或拒绝。
defer 到底是什么?
推迟结果意味着您返回结果的(异步)承诺,而不是直接(同步)返回结果。并且还返回延迟拒绝而不是同步抛出 https://stackoverflow.com/q/21887856/1048572.
请注意“defer" 也在一些库中使用(Q https://github.com/kriskowal/q/wiki/API-Reference#qdefer) 作为方法名来构造Deferred
对象-见这个答案关于Deferred、Promise 和 Future 之间的区别 https://stackoverflow.com/a/18858041/1048572以获得一个很好的解释。
哦,永远不要相信变量名称:defer
也可能是缩写的“deferredObject”。