bbl*_*ack 5 javascript promise ecmascript-6 bluebird es6-promise
现在看来,创建延迟对象通常不鼓励使用ES6风格的Promise构造函数.是否存在使用延迟需要(或者更好地某种方式)的情况?
例如,在此页面上,给出以下示例作为使用延迟的理由:
function delay(ms) {
var deferred = Promise.pending();
setTimeout(function(){
deferred.resolve();
}, ms);
return deferred.promise;
}
Run Code Online (Sandbox Code Playgroud)
但是,这可以使用Promise构造函数完成:
function delay(ms) {
return new Promise(function(resolve, reject){
setTimeout(function(){
resolve();
}, ms);
});
}
Run Code Online (Sandbox Code Playgroud)
是否存在使用延迟需要(或者更好地某种方式)的情况?
没有这种情况需要延期."更好"是一个意见问题,所以我不会在这里解决.
ES6 promise规范没有延迟对象是有原因的. 你根本不需要一个. 人们过去使用延迟对象的任何东西总是可以用另一种不使用延迟对象的方式完成.
首先,大多数用法非常适合promise构造函数模型.其次,任何其他不完全适合该模型的情况仍然可以通过promise构造函数完成,或者以一个已解决的promise开始并链接到它.
我看到的延迟的主要用例是当你想要将能力传递给resolve()或reject()除了创建承诺的代码之外的其他一些代码.延迟使得非常简单,因为您可以只传递延迟对象,并且它具有解析或拒绝它的公共方法.但是,有了承诺,你也可以通过resolve和/或reject方法.由于它们自动绑定到特定对象,因此您只需传递函数引用即可.而且,在其他情况下,您可以让其他代码创建自己的承诺并自行解决/拒绝它,并将该操作链接到您的,而不是让他们解决/拒绝您的承诺.这一切都像传递延迟对象一样干净吗?大多是见仁见智,但也不是很常见的用例和所有的东西,可以无需单独的递延对象来完成.
并且,正如torazaburo指出的那样,让一些外部代码解决或拒绝你的承诺本身就是一种反模式.您创建了承诺 - 您解决/拒绝承诺.如果您想使用外部事件来决定何时解决/拒绝它,那么让他们通知您(通过他们自己的承诺或回调),您可以解决/拒绝您自己的承诺.或者,让他们创建自己的承诺,你可以使用.这真的是理想的模型.或者,让他们链接到您的承诺,以便最终结果在他们的操作完成时被门控.
如果一个人习惯使用延迟对象进行编码(比如延迟使用jQuery),那么在没有它的情况下进行编码可能需要一点时间,但是过一会儿之后你就会开始以不同的方式思考并开始自然地使用承诺构造函数.
一旦你宣传了你在任何给定应用程序中使用的异步操作的范围,你甚至不再需要创建自己的承诺是非常罕见的,因为你主要只是建立你所调用的异步函数已经创建或使用的承诺流量控制操作Promise.all(),为您创造超级承诺.
这是反模式的要点. 使用已为您创建的承诺,而不是手动创建更多. 链接他们.返回.then()处理程序的promise 以在逻辑控制下链接异步操作.
当然,现有的异步操作不会返回有人需要创建承诺的promises,但是应该在promisify层中完成主要编码逻辑的提供之外的某个地方,并且只对该操作执行一次,然后调用异步操作的代码应该只能使用返回的promises.
| 归档时间: |
|
| 查看次数: |
632 次 |
| 最近记录: |