Promise A+实现:当调用then()并且Promise仍然挂起时该怎么办
Promise A+ Implementation: what to do when call then() and the promise is still pending?
一段时间以来,我一直在舒适地使用promise实现。
所以我决定实现我自己的promise库只是为了好玩(并在这个过程中学到一些东西)。
我正在努力遵循Promise A+规范(也许我会省略一些细节,因为我无意将其作为生产代码)。
我的完整代码(仍在进行中)就是这个要点,但相关部分如下。
我在实现then()
时遇到了一个问题。当承诺悬而未决时,我根本不知道该怎么办:
Promise.prototype.then = function(onFulfill, onReject) {
var ret;
var self = this;
if (isFulfilled.call(this)) {
console.log('fulfilled');
if (isFunction(onFulfill)) {
return promiseResolution(this, onFulfill(this.value));
} else {
return new Promise(function(resolve){
resolve(self.value);
});
}
} else if (isRejected.call(this)) {
console.log('rejected');
if (isFunction(onReject)) {
return promiseResolution(this, onReject(this.reason));
} else {
return new Promise(function(resolve, reject){
reject(self.reason);
});
}
} else if (isPending.call(this)) {
console.log('pending');
enqueueCallback(this.fulfillCallbackQueue, onFulfill);
enqueueCallback(this.rejectCallbackQueue, onReject);
// ... what now?
}
};
function promiseResolution(promise, x) {
if (promise === x) {
throw new TypeError('Cannot resolve promise with itself');
} else if (x instanceof Promise) {
if (isFulfilled.call(x)) {
return new Promise(function(resolve, reject){
resolve(x.value);
});
} else if (isRejected.call(x)) {
return new Promise(function(resolve, reject){
reject(x.reason);
});
} else {
return x;
}
} else {
return new Promise(function(resolve, reject){
resolve(x);
});
}
}
答案肯定很明显,但我在这里有点不知所措。
编辑:
我已经用我正在编写的测试套件更新了要点。
编辑#2:
我成功地运行了第一个实现的测试。这是我存储代码的git存储库。我会努力不断改进。
感谢@BenjaminGruenbaum。
首先,确保您没有实现A+,除非您有充分的理由这样做。实现一个好的承诺是非常棘手的。
当promise挂起时,将以下内容推送到处理程序数组:
- 你正在返回的承诺-因为承诺A+要求你检测到一个承诺正在返回并拒绝它
- 从构造函数中提取的promise的reject函数
- 从构造函数中提取的promise的解析函数
- onFulfilled处理程序
- onRejected处理程序
当返回新承诺的承诺经过解析时,您需要
- 如果它拒绝了-完成后运行拒绝处理程序和
resolve
(如果抛出则拒绝)。检查返回值上是否有相同的引用。如果没有处理程序或者它不是函数,则可以传递e => { throw e; }
- 如果它完成了-完成后运行履行处理程序和
resolve
(如果抛出则拒绝)。检查返回值上是否有相同的引用。如果没有处理程序或者它不是函数,则可以传递v => v
当然,resolve
本身需要进行同化,也需要从外国进行同化。我建议运行promises/A+测试套件,并一点一点地解决它,直到所有测试都通过。
相关文章:
- JavaScript执行暂时挂起页面
- 是定义的操作系统睡眠/挂起期间setTimeout的行为
- Chrome浏览器“;挂起”;同时在循环中执行AJAX请求
- fullcalendar在删除导致浏览器挂起的多个事件时速度较慢
- 应用将图表转换为图像的jqplot代码时Chrome挂起
- 如何在不使用Internet Explorer的情况下从未挂起的HTML文件执行程序
- MongoDB collection.find()查询挂起
- 使用子字符串方法时应用程序挂起的原因
- 如何在AngularJS中取消挂起的请求
- 从node.js应用程序调用Mongoose Model.save()时挂起
- Chrome,Safari在从本地存储读取时挂起,而Firefox很好
- IE 10 挂起 XMLHttpRequest 6 分钟,然后响应请求(使用 AngularJS 实现 CRSF)
- 挂起 JavaScript 键关闭事件
- HERE 映射 JS API v3 集群提供程序挂起,添加许多数据点
- Ajax 调用挂起在 jQuery 中
- writeln img src将数据提交到外部系统-Firefox和IE挂起
- 在jQuery中,.state()如何确定一个承诺是挂起的、已解决的还是被拒绝的
- 如何检查Promise是否处于挂起状态
- Promise A+实现:当调用then()并且Promise仍然挂起时该怎么办
- 在promise挂起时延迟执行的回调函数