【问题标题】:Delayed binding for promises延迟绑定承诺
【发布时间】: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


【解决方案1】:

你想多了。

“后期绑定”就是我们通常所说的“通过”,所以不要绑定。

.then((adjustedDate) => aGreatFunctionNeedingADateInput(adjustedDate))

.then(aGreatFunctionNeedingADateInput)

【讨论】:

    猜你喜欢
    • 2015-03-08
    • 2015-03-27
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 2016-12-08
    • 2015-08-25
    相关资源
    最近更新 更多