gpt4 book ai didi

javascript - promise A+ 实现 : what to do when call then() and the promise is still pending?

转载 作者:行者123 更新时间:2023-11-29 14:44:10 25 4
gpt4 key购买 nike

一段时间以来,我一直在舒适地使用 promise 实现。

所以我决定实现自己的 promise 库只是为了好玩(并在此过程中学习一些东西)。

我正在尝试关注 Promise A+规范(也许我会省略一些细节,因为我不打算将其作为生产代码)。

我的完整代码(仍在进行中)在这个 gist 中, 但相关部分如下。

我在执行 then() 时遇到问题。当 promise 悬而未决时,我根本不知道该怎么办:

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 repository我存储代码的地方。我会努力改进它。

感谢@BenjaminGruenbaum。

最佳答案

首先 - 确保您没有实现 A+,除非您有充分的理由这样做。实现一个好的 promise 是非常棘手的。

当 promise 未决时 - 将以下内容推送到处理程序数组:

  • 您要返回的 promise - 因为 Promises A+ 要求您检测到返回自身的 promise 并拒绝它。
  • 您从构造函数中提取的 promise 的拒绝函数。
  • 您从构造函数中提取的 promise 的解析函数。
  • onFulfilled 处理程序
  • onRejected 处理程序。

当返回新promise的promise经过resolution时,需要

  • 如果它被拒绝 - 运行拒绝处理程序并在完成时 resolve(如果它抛出则拒绝)。检查返回值的相同引用。如果没有处理程序或者它不是函数 - 你可以传递 e => { throw e; } 代替。
  • 如果它完成了 - 运行完成处理程序并在完成时 resolve(如果抛出则拒绝)。检查返回值的相同引用。如果没有处理程序或者它不是函数 - 您可以传递 v => v

当然,resolve本身需要进行同化,来自国外的thenables也是如此。我建议针对 promises/A+ 测试套件运行并逐步解决,直到所有测试通过。

关于javascript - promise A+ 实现 : what to do when call then() and the promise is still pending?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34664291/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com