Don*_*tch 5 javascript promise es6-promise
我想我终于在大多数情况下都围绕着javascript/ES6 Promises.这并不容易!但是有些东西让我对这个设计感到困惑.
为什么Promise构造函数会进行回调?鉴于立即调用回调,调用者不能只执行该代码,从而避免一个不必要的心灵弯曲"不要打电话给我,我会打电话给你"?
以下是我所认为的Promise使用的原型示例,复制自Jake Archibald的Javascript Promises教程http://www.html5rocks.com/en/tutorials/es6/promises/#toc-promisifying-xmlhttprequest,并删除了注释.
它是XMLHttpRequest GET请求的基于Promise的包装器:
function get(url) {
return new Promise(function(resolve, reject) {
var req = new XMLHttpRequest();
req.open('GET', url);
req.onload = function() {
if (req.status == 200) {
resolve(req.response);
}
else {
reject(Error(req.statusText));
}
};
req.onerror = function() {
reject(Error("Network Error"));
};
req.send();
});
}
Run Code Online (Sandbox Code Playgroud)
对我来说,上面的代码将更容易理解,如果它被重写如下,使用我正在想象的一种非常不同的承诺,具有无参数构造函数和解析/拒绝方法:
function get(url) {
var promise = new MyEasierToUnderstandPromise();
var req = new XMLHttpRequest();
req.open('GET', url);
req.onload = function() {
if (req.status == 200) {
promise.resolve(req.response);
}
else {
promise.reject(Error(req.statusText));
}
};
req.onerror = function() {
promise.reject(Error("Network Error"));
};
req.send();
return promise;
}
Run Code Online (Sandbox Code Playgroud)
就Promise而言,MyEasierToUnderstandPromise并不太难实现.起初我尝试将它变成Promise的实际子类,但由于某种原因,我无法让它工作; 所以我把它实现为一个简单的工厂函数,它返回一个普通的旧Promise对象,附加了一些额外的函数,其行为类似于成员函数:
function NewMyEasierToUnderstandPromise() {
var resolveVar;
var rejectVar;
var promise = new Promise(function(resolveParam, rejectParam) {
resolveVar = resolveParam;
rejectVar = rejectParam;
});
promise.resolve = resolveVar;
promise.reject = rejectVar;
return promise;
};
Run Code Online (Sandbox Code Playgroud)
那么,为什么Promise不是这样设计的呢?我想如果是的话,它会帮助我更快地理解Promise--我敢打赌它会把我的学习时间缩短一半.
我知道很多聪明人都参与制作Promise API,每个人似乎都很高兴并为此感到自豪,所以我想知道他们在想什么.
Promise旨在用作值.ES构造函数方法封装了Promise的创建,然后可以像值一样传递它.当该值被传来传去,该值的消费者没有必要resolve
和reject
等这些功能不应该是公共API的一部分.
(以及有关异常处理和链接的所有内容)
归档时间: |
|
查看次数: |
208 次 |
最近记录: |