【发布时间】:2016-01-31 06:32:34
【问题描述】:
我正在尝试弄清楚如何对 Promise 函数参数进行后期绑定。在大多数情况下,我希望 Promise Flow 只是一系列函数名称,因此它读起来像一系列步骤(除非它是像下面这样的单行)
(adjustedDate) => { aGreatFunctionNeedingADateInput.bind(undefined,adjustedDate) }
这是一个例子。该函数正在等待一个日期,因为它是后期绑定的输入,并且该输入将来自它之前的承诺链中的某个步骤。
let aGreatFunctionNeedingADateInput = greatFunction.bind(undefined, x, y);
somePromise().then(functionThatMightChangeDate)
.then( (adjustedDate) => {
aGreatFunctionNeedingADateInput.bind(undefined,adjustedDate)
})
.then(aGreatFunctionNeedingADateInput)
我知道这里发生了很多奇怪且可能错误的范围界定,但本质上我想将 Promise 函数的最后一个参数绑定为最后一步,以防它在此过程中发生变化。让我知道这是否可行。
更新:
在此链接中找到此示例:http://lhorie.github.io/mithril-blog/curry-flavored-promises.html
它实现了类似的结果,除了它在创建时绑定到一个固定值(John Doe),而不是像我在下面尝试做的那样在承诺链的中间。类似的想法,但我可能会根据我的用途对其进行调整。
var createdBy = function(user, items) {
return items.filter(function(item) {
return item.createdBy == user
});
};
m.request({method: "GET", url: "/api/projects"})
.then(pastItems) // filter past projects
.then(createdBy.bind(this, "John Doe")) // filter projects created by john doe
.then(log) // log past projects created by john doe
【问题讨论】:
-
您是否有理由使用
bind而不仅仅是将参数传递给函数?对于您的用例,我对您要完成的工作感到有些困惑,在我看来,您只需要在then(..块中而不是在上面调用aGreatFunctionNeedingADateInput。 -
我不太清楚你想做什么,但这里有很多选项可以让 Promise 链中的后面的函数访问一些早期的结果:Chain promise results。如果您希望该值能够更改,您显然不能提前
.bind()值。您可以.bind()一个对象引用,并将数据作为该对象的一个属性,该属性可以在此过程中更改。但是,解决这个问题的常用方法是在共享范围内使用局部变量。 -
你们都提出了好点。 @jfriend00 看着你的例子(将中间结果分配给更高的范围),我很困惑为什么我的方法不起作用。该变量应该在范围内。但是,根据
then.子句的绑定时间,它们可能使用了一些陈旧的值。我想由于 Promise 的异步特性,js 引擎可能会初始化所有函数/闭包,到达代码的底部,然后开始实际执行 Promise 链?这可以解释它。 -
我知道我在做的事情有点矫枉过正/令人费解,我刚刚在看一些函数式编程示例,它们正在柯里化函数,等到最后一刻绑定关键参数,然后评估它。我试图看看如何在这里应用这种概念。
-
其实刚刚找到一个类似的例子说明我正在尝试做的事情,我并没有想象中的那么疯狂! lhorie.github.io/mithril-blog/curry-flavored-promises.html
标签: javascript promise bind late-binding