- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
使用 Promises 设计模式,是否可以实现以下功能:
var a, promise
if promise.resolve
a = promise.responsevalue;
if promise.reject
a = "failed"
AFTER resolution/rejection. Not ASYNC!!
send a somewhere, but not asynchronously. //Not a promise
finally
在
try - catch
情况。
最佳答案
注意: finally
现在是 JavaScript promise 的标准部分,所以你可以这样做:
thePromise.then(result => doSomething(result)
.catch(error => handleOrReportError(error))
.finally(() => doSomethingAfterFulfillmentOrRejection());
finally
是标准的:
catch
返回一个值, 那么你可以使用
then
关于
catch
的结果.
thePromise.then(result => doSomething(result)
.catch(error => handleErrorAndReturnSomething(error))
.then(resultOrReturnFromCatch => /* ... */);
catch
返回某些内容,而不是抛出或返回被拒绝的 promise ),并依赖于这一事实。
{
let worker = (p, f, done) => {
return p.constructor.resolve(f()).then(done, done);
};
Object.defineProperty(Promise.prototype, "finally", {
value(f) {
return this.then(
result => worker(this, f, () => result),
error => worker(this, f, () => { throw error; })
);
}
});
}
{
let worker = (p, f, done) => {
return p.constructor.resolve(f()).then(done, done);
};
Object.defineProperty(Promise.prototype, "finally", {
value(f) {
return this.then(
result => worker(this, f, () => result),
error => worker(this, f, () => { throw error; })
);
}
});
}
test("p1", Promise.resolve("good")).finally(
() => {
test("p2", Promise.reject("bad"));
}
);
function test(name, p) {
return p.then(
result => {
console.log(name, "initial fulfillment:", result);
return result;
},
error => {
console.log(name, "initial rejection; propagating it");
throw error;
}
)
.finally(() => {
console.log(name, "in finally");
})
.then(
result => {
console.log(name, "fulfilled:", result);
},
error => {
console.log(name, "rejected:", error);
}
);
}
this.constructor
的使用所以我们调用resolve
在任何类型的 promise (包括可能的子类)上创建了原始 promise ;这与 Promise.resolve
的方式一致和其他的工作,并且是支持子类 promise 的重要组成部分。 finally
的任何参数回调,并且没有指示 promise 是被履行还是被拒绝,为了与 finally
保持一致经典try-catch-finally
结构体。但是,如果需要,可以轻松地将其中一些信息传递到回调中。 finally
返回的值回调 除了 如果它是一个 promise ,它会在允许链继续之前等待 promise 解决。 (function() {
function worker(ctor, f, done) {
return ctor.resolve(f()).then(done, done);
}
Object.defineProperty(Promise.prototype, "finally", {
value: function(f) {
var ctor = this.constructor;
return this.then(
function(result) {
return worker(ctor, f, function() {
return result;
});
},
function(error) {
return worker(ctor, f, function() {
throw error;
});
}
);
}
});
})();
(function() {
function worker(ctor, f, done) {
return ctor.resolve(f()).then(done, done);
}
Object.defineProperty(Promise.prototype, "finally", {
value: function(f) {
var ctor = this.constructor;
return this.then(
function(result) {
return worker(ctor, f, function() {
return result;
});
},
function(error) {
return worker(ctor, f, function() {
throw error;
});
}
);
}
});
})();
test("p1", Promise.resolve("good")).finally(function() {
test("p2", Promise.reject("bad"));
});
function test(name, p) {
return p.then(
function(result) {
console.log(name, "initial fulfillment:", result);
return result;
},
function(error) {
console.log(name, "initial rejection; propagating it");
throw error;
}
)
.finally(function() {
console.log(name, "in finally");
})
.then(
function(result) {
console.log(name, "fulfilled:", result);
},
function(error) {
console.log(name, "rejected:", error);
}
);
}
Promise
而不是修改它的原型(prototype):
let PromiseX = (() => {
let worker = (p, f, done) => {
return p.constructor.resolve(f()).then(done, done);
};
class PromiseX extends Promise {
finally(f) {
return this.then(
result => worker(this, f, () => result),
error => worker(this, f, () => { throw error; })
);
}
}
PromiseX.resolve = Promise.resolve;
PromiseX.reject = Promise.reject;
return PromiseX;
})();
let PromiseX = (() => {
let worker = (p, f, done) => {
return p.constructor.resolve(f()).then(done, done);
};
class PromiseX extends Promise {
finally(f) {
return this.then(
result => worker(this, f, () => result),
error => worker(this, f, () => { throw error; })
);
}
}
PromiseX.resolve = Promise.resolve;
PromiseX.reject = Promise.reject;
return PromiseX;
})();
test("p1", PromiseX.resolve("good")).finally(
() => {
test("p2", PromiseX.reject("bad"));
}
);
function test(name, p) {
return p.then(
result => {
console.log(name, "initial fulfillment:", result);
return result;
},
error => {
console.log(name, "initial rejection; propagating it");
throw error;
}
)
.finally(() => {
console.log(name, "in finally");
})
.then(
result => {
console.log(name, "fulfilled:", result);
},
error => {
console.log(name, "rejected:", error);
}
);
}
Promise.prototype
的情况下这样做。或子类化。在 ES5 中,效用函数是
非常使用起来很尴尬,因为您必须将 promise 传递给它才能采取行动,这与正常的 promise 用法完全不符。在 ES2015 中,可以做一些更自然的事情,但调用起来仍然比修改原型(prototype)或子类化更痛苦:
let always = (() => {
let worker = (f, done) => {
return Promise.resolve(f()).then(done, done);
};
return function always(f) {
return [
result => worker(f, () => result),
error => worker(f, () => { throw error; })
];
}
})();
thePromise.then(...always(/*..your function..*/)).
always
可以为
then
提供两个参数.
let always = (() => {
let worker = (f, done) => {
return Promise.resolve(f()).then(done, done);
};
return function always(f) {
return [
result => worker(f, () => result),
error => worker(f, () => { throw error; })
];
}
})();
test("p1", Promise.resolve("good")).then(...always(
() => {
test("p2", Promise.reject("bad"));
}
));
function test(name, p) {
return p.then(
result => {
console.log(name, "initial fulfillment:", result);
return result;
},
error => {
console.log(name, "initial rejection; propagating it");
throw error;
}
)
.then(...always(() => {
console.log(name, "in finally");
}))
.then(
result => {
console.log(name, "fulfilled:", result);
},
error => {
console.log(name, "rejected:", error);
}
);
}
finally
的担忧。不会等待 promise ;这是最后一个
always
再举一个例子,延迟证明它确实如此:
let always = (() => {
let worker = (f, done) => {
return Promise.resolve(f()).then(done, done);
};
return function always(f) {
return [
result => worker(f, () => result),
error => worker(f, () => { throw error; })
];
}
})();
test("p1", 500, false, "good").then(...always(
() => {
test("p2", 500, true, "bad");
}
));
function test(name, delay, fail, value) {
// Make our test promise
let p = new Promise((resolve, reject) => {
console.log(name, `created with ${delay}ms delay before settling`);
setTimeout(() => {
if (fail) {
console.log(name, "rejecting");
reject(value);
} else {
console.log(name, "fulfilling");
resolve(value);
}
}, delay);
});
// Use it
return p.then(
result => {
console.log(name, "initial fulfillment:", result);
return result;
},
error => {
console.log(name, "initial rejection; propagating it");
throw error;
}
)
.then(...always(() => {
console.log(name, "in finally");
}))
.then(
result => {
console.log(name, "fulfilled:", result);
},
error => {
console.log(name, "rejected:", error);
}
);
}
关于javascript - promise : Execute something regardless of resolve/reject?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38830314/
我有一个 JTree,我正在尝试对其进行修改,以便任何选定节点的实际选择区域将从 JTree 的最左侧扩展到 JTree 的最右侧。 网络上的大多数示例都在谈论扩展 BasicTreeUI。从那里您只
使用 Promises 设计模式,是否可以实现以下功能: var a, promise if promise.resolve a = promise.responsevalue; if
我一直在尝试编辑我的代码,以便当我的网页从我的 1980x1080 显示器移动到 2560x1440 笔记本电脑屏幕时,元素(即文本、菜单栏...)不会改变位置。我尝试用包装函数包装所有 HTML 代
使用 MatBlazor (1.5.4) MatDialog ,我有兴趣将对话框大小固定或设置为总页面的百分比。当前,行为是对话框以其适合内容的大小打开。 我尝试在对话框定义的不同部分添加显式样式,但
我们希望实现电子发现集成,可以跟踪所有过去和新的聊天和 channel 消息。 但我们观察到,使用委托(delegate)权限,应用程序只能列出用户(管理员或非管理员)所属的聊天;而使用应用程序权限时
我正在寻找一种方法,将 :nth-child 方法应用于分布在不同父级/容器中的元素(但似乎每个容器都从 0 开始倒数):
在 Ext JS 网格中强制日期以 UTC 显示(并忽略浏览器本地时间)的最佳方式是什么? 我的模型接收 UTC 日期: "2014-06-24T00:00:00+00:00" 我的网格有一个日期列:
我有一个要求,无论内容如何,网站只需要在几秒钟内响应用户。 现在 Jmeter 中的 HTTP 代理服务器 -> URL 模式中有一个选项可以排除,然后开始记录。 这里我可以指定gif、css或其
有没有办法在 Ant 中定义一个总是在 处执行的任务?结束 每次运行?此 SO question提供了一种方法,在 开始 每次运行,在执行任何其他目标之前,但我正在研究相反的情况。 我的用例是在运行期
我正在移植 Box2D 以了解更多关于 android 移植的信息。 我可以编译项目并看到以下内容.... ls libs/ armeabi armeabi-v7a 现在我想做类似 this 的事情但
当变量/属性的类型错误时,我经常遇到问题。问题是很难追踪,因为我的 PHP (5.3) 刚刚崩溃,没有输出错误,甚至没有写入错误日志 (*1)。它只是崩溃。 我认为访问像数组这样的字符串不应该是不可追
假设角色在游戏中跳跃需要一整秒,如果 FPS 为 10fps、30fps、100fps 等,游戏开发人员如何将跳跃时间保持在 1 秒? - 如果你明白我的意思,你会如何阻止游戏的 fps 基本上影响游
我有一个 if 条件,我需要检查 A 是否与 B 具有相同的值,无论数据类型如何,例如 if (A == B) { //body of if statement } 但是如果存在 ==,服务器检
我无法理解 Java 中的以下 OOP 问题: 我有两个类扩展了一些基本的库类。 class myMovie extends Movie { int posi_x; int posi_
这是我第一次使用 jQuery Masonry Plugin . 我遇到的问题是我正在使用两种尺寸的 .boxes。所以有一个基本尺寸 180x120px 和双倍尺寸 `360x240px`` 为了解
我有以下简化标记: Conditional column 1 Column 2 Column 3
这可能是一个迭代的问答过程,因为我不确定要粘贴哪个代码。我有一个自定义的高级搜索表单(使用 ng-submit),它将查询对象传递到 Controller 方法并调用服务。当用户在一个或多个字段中输入
我已经尝试使用 css 和 jquery 构建一个简单的评论 View ,在每一行的末尾,一个“回复”链接应该在下面弹出一个小框来填写评论。为此,我使用了最初隐藏的 div,然后使用 jquery 显
我试过所有 showAsAction 值都无济于事。 我基本上只希望删除按钮可见,而退出将进入溢出(3 个点)。我将向溢出部分添加更多内容,但我想知道如何强制退出。 提前致谢。 最佳答案 使用
QLineEdit 有一个信号 QLineEdit::editingFinished 当用户完成编辑时发出,例如按回车键。但是,如果设置了验证器或输入掩码,则只有在输入有效时才会发出 editingF
我是一名优秀的程序员,十分优秀!