【发布时间】:2016-10-03 10:12:37
【问题描述】:
我有以下使用 ES6 Promise 的代码:
const ctx = {}
Promise.resolve()
.then(() => doSomethingWith(ctx))
.then((retValue) => doSomethingElseWith(retValue, ctx))
我希望能够做这样的事情:
const ctx = {}
using(ctx)
.then((ctx) => doSomethingWith(ctx))
.then((retValue, ctx) => doSomethingElseWith(retValue, ctx))
对于第一个then,我有这样的事情:
function using(ctx) {
const p = Promise.resolve()
p.then = (fn) => withCtx(fn, ctx)
return p
}
function withCtx (fn, ctx) {
const p = new Promise((resolve) => {
resolve(fn.apply(this, [ctx]))
})
return p
}
但我希望它能够处理第二个的情况,它同时接受先前的承诺返回值和上下文......我怎么会有这部分:
fn.apply(this, [ctx]) // want previous promise returned value and ctx here !
处理这种情况 fn 已经采用了我们想要传播的参数......上面描述的retValue 情况。
有什么想法吗? (我想在之后介绍的用例是能够随时停止 Promise 链,将值保存在磁盘上并随时重新启动,并从磁盘恢复更改的上下文)
【问题讨论】:
-
ctx是否与回调函数在同一个范围内?还是更像return using(ctx);和then回调将附加到其他地方......? -
ctx不能被视为始终在范围内...我希望能够环绕传递给then的函数,以便我可以处理/更改retValue和ctx以 AOP 方式 -
您始终可以编写自己的 Promise 实现 - 因为您无法更改“本机”实现您的出价
-
“你总是可以编写你自己的 Promise 实现” - 我不认为这是一个明智的建议。编写一个 Promise 实现并不是一件容易的事——而且它已经完成了。只需使用现有的。
-
您可以查看绑定的承诺,就像 bluebird 提供的那样:bluebirdjs.com/docs/api/promise.bind.html。也许重写你的函数,使它们不依赖于外部范围状态也是一种选择?
标签: javascript node.js promise es6-promise