【问题标题】:Continuation passing JavaScript继续传递 JavaScript
【发布时间】:2014-05-20 17:49:12
【问题描述】:

有人可以向我解释一下 javascript 中持续传递的概念吗? 我试图通过阅读此http://nathansjslessons.appspot.com/lesson?id=1090 并尝试解决给出的练习来理解它,但我似乎无法解决它。

正确的做法是什么?

我试过这个:

var bothC = function (fC, gC, success, failure) {
    var f_success, f_failure;
    f_success = function () {
        success();
    };
    f_failure = function () {
        var g_success, g_failure;
        g_success = function () {
            success();
        };
        g_failure = function () {
            failure();
        };
        gC(g_success, g_failure);
    };
    fC(f_success, f_failure);
};

【问题讨论】:

  • 我以前从未听说过“延续”这个词。
  • 与promise的概念类似。当当前方法完成时,您接受一个作为参数传入的回调,而不是返回一个值。
  • 我使用了 JavaScript 队列,您可以在其中将队列中的下一个函数作为参数传递。我只是不知道它有一个术语;-)
  • @RocketHazmat 这很常见!在此处阅读更多信息en.wikipedia.org/wiki/Continuation-passing_style

标签: javascript continuation-passing


【解决方案1】:

我试过了

不,你基本上只是复制重新实现了他们的seqC 函数。

正确的做法是什么?

function bothC(fC, gC, success, failure) {
    fC(function() {
        gC(success, failure);
    }, function() {
        gC(failure, failure);
    });
}

【讨论】:

  • 是的,你是对的,我只是复制了它,试图理解它会给我带来的错误并有一个起点。您能逐步解释为什么会这样吗?
  • 您应该从seqC 的简洁“简化”版本开始,它更容易理解(它唯一的好处是可用于解释的显式函数名称)。我真的不知道一步一步解释什么,你能告诉我你在什么时候感到困惑吗?
  • 当然。让我告诉你到目前为止我的理解。 fC 和 gC 是作为参数传递的两个函数,成功和失败是每个函数的延续。当我用这两个函数作为参数调用 fC 时,我不明白 gC 返回什么以及那两行相同的代码(function() { gC(success, failure) } )在做什么。
  • fCgC 不要 return,他们称之为传递的延续(这就是 CP 风格的全部意义所在!)。作为参数传递给fC 的两个函数正是那些延续回调。请注意,这两行并不相同 - 如果 fC 确实执行了失败延续,gC 将传递 failure 延续作为其成功和失败参数。
【解决方案2】:

这个练习的一个实用方法是定义一个这样的效用函数:

function pipe(f, g) {
    return function(success, failure) {
        f(function() {
            g(success, failure)
        }, failure)
    }
}

这个高阶函数由两个给定函数组成,因此第二个函数只有在第一个函数成功时才会运行。现在bothC 的实现变得微不足道了:

var bothC = function (fC, gC, hC, success, failure) {
    pipe(fC, gC)(success, failure);
};

多个参数也没问题:

var allC = function (funcList, success, failure) {
    funcList.reduce(function(x, f) { return pipe(x, f)})(success, failure)
};

【讨论】:

    猜你喜欢
    • 2012-07-04
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多