gpt4 book ai didi

javascript - 这是一个可继承的 Promise 吗?

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

只是为了好玩/学习,我想扩展 Promise 并通过 stackoverflow 上知识渊博的人发现,它不能用标准的旧语法来完成。但无论如何我都想这样做,所以我想创建我自己的 IPromise 类,它组成一个 Promise 对象并允许其他人使用旧的非 ES6 语法从它继承。

我想知道这个实现与内置 Promise 可直接继承的世界有何不同,如果有人有洞察力,为什么内置 Promise 的实现者不允许使用旧语法继承。

这是我的可扩展/可继承的 IPromise 类:

// Inheritable Promise
IPromise = function(executor) {
this.promise = new Promise(executor);
};
IPromise.prototype = Object.create(Promise.prototype);
IPromise.prototype.constructor = IPromise;
IPromise.prototype.catch = function(fail) {
return this.promise.catch(fail);
}
IPromise.prototype.then = function(success, fail) {
return this.promise.then(success, fail);
};

// Usage
// No different to builtin Promsise
(new IPromise(function(resolve, reject) { return resolve(true); }))
.then(function(response) {
console.log('IPromise then is like Promise then', response);
})
.catch(function(error) {
console.log('IPromise catch is like Promise catch', error);
});

下面是一个将其扩展为批处理 ajax 的示例,该 ajax 等待所有请求完成,而不管它们是否失败。与内置功能略有不同。

// Inheriting
// You can inherit from IPromise like you would any normal class.
BatchAjax = function(queries) {
var batchAjax = this;
this.queries = queries;
this.responses = [];
this.errorCount = 0;
IPromise.call(this, function(resolve, reject) {
batchAjax.executor(resolve, reject);
});
};
BatchAjax.prototype = Object.create(IPromise.prototype);
BatchAjax.prototype.constructor = BatchAjax;
BatchAjax.prototype.executor = function(resolve, reject) {
var batchAjax = this;
$.each(this.queries, function(index) {
var query = this;
query.success = function (result) {
batchAjax.processResult(result, index, resolve, reject);
};
query.error = function (jqXhr, textStatus, errorThrown) {
batchAjax.errorCount++;
var result = {
jqXhr: jqXhr, textStatus: textStatus, errorThrown: errorThrown
};
batchAjax.processResult(result, index, resolve, reject);
};
$.ajax(query);
});
};
BatchAjax.prototype.processResult = function(result, index, resolve, reject) {
this.responses[index] = result;
if (this.responses.length === this.queries.length) {
if (this.errorCount === 0) {
resolve(this.responses);
} else {
reject(this.responses);
}
}
};

// Usage
// Inheriting from IPromise is boring, which is good.
var baseUrl = 'https://jsonplaceholder.typicode.com';
(new BatchAjax([{url: baseUrl + '/todos/4'}, {url: baseUrl + '/todos/5'}]))
.then(function(response) {console.log('Yay! ', response);})
.catch(function(error) {console.log('Aww! ', error);});

请记住,我只是在学习,这并不意味着有用,只是有趣。但是请随意提出残酷的批评,我愿意接受这样的想法,即这是一件愚蠢的事情:)

为看一看干杯,为所有代码感到抱歉!

编辑:这是我最初试图扩展 promise 的问题:Extending a Promise in javascript .它似乎不适用于旧语法,因为如果 Promise 构造函数注意到它正在初始化不是 Promise 的东西(我认为),它会抛出类型错误。

edit2:jfriend00 的评论强调了一些有趣的事情。 IPromise.then 应该返回什么?目前它只是一个 Promise,但它应该是一个 IPromise 吗?

IPromise.prototype.then = function(success, fail) {
this.promise.then(success, fail);
return new IPromise(whatGoesHere?);
};

或者从它继承的任何类的实例。

IPromise.prototype.then = function(success, fail) {
this.promise.then(success, fail);
return new this.constructor(whatGoesHere?);
};

或者它可以只返回这个吗?

IPromise.prototype.then = function(success, fail) {
this.promise.then(success, fail);
return this;
};

我知道 Promise.then 会返回一个 Promise,但我不知道该 Promise 是如何设置或预期如何运行的。这就是为什么我避免了这个问题,只是从 this.promise.then 返回了 Promise。还有其他明智的解决方案吗?

最佳答案

是的,您的 IPromise 的行为很像真正的 Promise。但是例如,您不能对它们调用 native promise 方法:

var p = new Promise(function(resolve) { return resolve(true); });
var ip = new IPromise(function(resolve) { return resolve(true); });
Promise.prototype.then.call(p, v => console.log(v));
Promise.prototype.then.call(ip, v => console.log(v)); // TypeError

如果您希望您的IPromise 实例成为真正的promise,它们必须由Promise 初始化。该构造函数添加了一些您无法模拟的内部槽,例如 [[PromiseState]]。但是 Promise 创建的 promise 继承自 Promise.prototype,在 ES6 之前没有标准的方法将 [[Prototype]] 更改为 IPromise.prototype 在创建对象之后。

使用 ES6 类,

class IPromise extends Promise {
// You can add your own methods here
}

关于javascript - 这是一个可继承的 Promise 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41816158/

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