- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
只是为了好玩/学习,我想扩展 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/
我使用的是 PHP 5.3 稳定版,有时会遇到非常不一致的行为。据我所知,在继承中,父类(super class)中的所有属性和方法(私有(private)、公共(public)和 protected
所以我一直在努力寻找正确的方法来让应该非常简单的继承发挥作用(以我想要的方式 ;)),但我失败得很惨。考虑一下: class Parent { public String name = "Pare
给定这些类: class Father { public Father getMe() { return this; } } class Child extends Father {
为什么最后打印“I'm a Child Class”。 ? public class Parent { String parentString; public Parent()
我知道有很多类似的问题对此有很多很好的答案。我试着看看经典的继承方法,或者那些闭包方法等。不知何故,我认为它们对我来说或多或少是“hack”方法,因为它并不是 javascript 设计的真正目的。
我已经使用表单继承有一段时间了,但没有对以下方法进行太多研究。只需创建一个新类而不是表单并从现有表单继承并根据需要将所需控件转换为 protected 。 Visual Studio 2010 设计器
我原以为下面的代码片段会产生编译错误,因为派生类不会有我试图在 pub_fun() 中访问的 priv_var。但是它编译了,我得到了下面提到的输出。有人可以解释这背后的理论吗? class base
继承的替代方案有哪些? 最佳答案 Effective Java:优先考虑组合而不是继承。 (这实际上也来自《四人帮》)。 他提出的情况是,如果扩展类没有明确设计为继承,继承可能会导致许多不恰当的副作用
我有2个类别:动物( parent )和狗(动物的“ child ”),当我创建一个 Animal 对象并尝试提醒该动物的名称时,我得到了 undefined ,而不是她的真名。为什么?(抱歉重复发帖
我试图做继承,但没想到this.array会像静态成员一样。我怎样才能让它成为“ protected /公开的”: function A() { this.array = []; } func
在创建在父类中使用的 lambda 时,我试图访问子类方法和字段。代码更容易解释: class Parent { List> processors; private void do
如果我有一个对象,我想从“ super 对象”“继承”方法以确保一致性。它们将是混合变量。 修订 ParentObj = function() { var self = this; t
class Base { int x=1; void show() { System.out.println(x); } } class Chi
目前我正在尝试几种不同的 Javascript 继承方法。我有以下代码: (“借用”自 http://www.kevlindev.com/tutorials/javascript/inheritanc
我在 .popin-foto 元素中打开一个 popin。当我尝试在同一元素中打开子类 popin 时,它不起作用。 代码 这是 parent function Popin(container, ti
我有以下两个类: class MyClass { friend ostream& operatorvalue +=1; return *this; } 现在
有没有办法完全忽略导入到 html 文件中的 header 中的 CSS 文件? 我希望一个页面拥有自己独立的 CSS,而不是从任何其他 CSS 源继承。 最佳答案 您可以在本地样式表中使用 !imp
Douglas Crockford似乎喜欢下面的继承方式: if (typeof Object.create !== 'function') { Object.create = functio
假设我有以下代码: interface ISomeInterface { void DoSomething(); void A(); void B(); } public
class LinkedList{ public: int data; LinkedList *next; }; class NewLinkedList: public Lin
我是一名优秀的程序员,十分优秀!