如何在 JavaScript es6 中代理承诺
How to Proxy a Promise in JavaScript es6
我正在尝试在原生Firefox中代理一个承诺(并使用Babel)。
var prom = new Promise(function(resolve, reject){resolve(42)});
var promProxy = new Proxy(prom, {});
promProxy.then(function(response){console.log(response)});
这不起作用,我得到"类型错误:"然后"在未实现接口 Promise 的对象上调用。
你需要让你的处理程序实现 get() 陷阱并返回绑定版本的prom.then
var prom = new Promise(function(resolve, reject){resolve(42)});
var promProxy = new Proxy(prom, {
get: function(target, prop) {
if (prop === 'then') {
return target.then.bind(target);
}
}
});
promProxy.then(function(response){console.log(response)});
请注意,如果您只想代理所有访问器,则get
函数将如下所示:
var promProxy = new Proxy(prom, {
get: function(target, prop) {
var value = target[prop];
return typeof value == 'function' ? value.bind(target) : value;
}
});
bind
将确保在处理本机对象(如 Promises)或控制台时不会错误地调用该函数。
编辑:在某些情况下,浏览器/节点将具有过时的代理版本,在这种情况下,您需要使用和谐反射来使其更新。
嗯,这个问题是如何代理承诺。我来到这里是为了寻找如何承诺代理 - 或者更准确地说,如何解决代理。我怀疑其他人也可能降落在这里,所以我会在这里发布这个,以防万一。
我已经有一个很好的工作代理对象,然后我去尝试将其包装在一个承诺中:
var p = new Promise(function(resolve, reject) {
var proxy = get_my_proxy();
resolve(proxy);
});
难道你不知道吗,然后的解析方法要求我的代理提供then
属性(我的代理逻辑出乎意料,导致它抛出)。这可能并不理想,具体取决于您的代理用途,但这是我解决此问题的方法(并且足够恰当,因为我的问题与此相反,我的解决方案也是反向的)——通过返回null
then
- 从而让resolve()
知道我没有通过它Promise
(又名Thenable
)。
get: function(target, prop) {
if (prop === 'then') return null; // I'm not a Thenable
// ...the rest of my logic
}
相关文章:
- 我的职位回报太快了,如何做出承诺
- 打破承诺链的好方法是什么
- 从函数返回角度承诺
- 在不打开聊天屏幕的情况下制作Zopim-ding代理
- 我怎样才能获得承诺的价值
- 延期承诺值未更新/解析/延期
- 在承诺链中处理早期回报的最佳方式
- 承诺在非节点式回调上使用Bluebird
- 简单的ES6承诺问题-交换解决和拒绝参数
- 组合承诺和非承诺值
- 带有对象/原型的链式承诺(Q延期)
- AngularJS$q承诺使用socket.io
- React JS:未捕获(在承诺中)语法错误:在位置 0 的 JSON 中意外<令牌
- 当一些承诺失败时,如何继续使用$q.all()
- Nodejs和express路由,如何处理客户端的承诺
- 如何在多承诺链中处理谷歌地图API V3事件
- 承诺合并流
- JavaScript承诺-无法读取属性'那么'的未定义
- servlet和代理servlet之间的区别
- 如何在 JavaScript es6 中代理承诺