【问题标题】:Async fluent javascript (node) interface (using deferreds)异步流利的javascript(节点)接口(使用延迟)
【发布时间】:2013-05-21 12:13:39
【问题描述】:

在 Javascript (node.js) 中构建流畅界面的最佳方法是什么
obj.function1().function2().function3();

哪里的函数是异步方法?

有一个名为chainsaw的模块,但如果它可能与deferreds和promise有关(https://github.com/kriskowal/q

UPD:使用 q.js 链接

obj.function1().then(obj.function2) 
//inside obj.function2 "this" context is lost, 
//and code is actually broken

obj.function1().then(funciton(){
  obj.function2() // <-- "this" context is OK
}) 

【问题讨论】:

    标签: javascript node.js fluent-interface deferred


    【解决方案1】:

    是的,很好。链需要以不同的方式构造:

    obj.function1().then(obj.function2).then(obj.function3);
    
    • function1 需要返回已解决/可解决的承诺。

    • function2(或所有中间函数)需要返回结果或新的已解决/可解决承诺。

    • function3(或最后出现的函数)需要对链中较早函数的累积结果进行处理 - 即。它必须是“消费者”功能。

    由于 Promise 具有拒绝和解决机制,因此 Promise 链提供了比链锯更大的内在可能性,以允许/终止沿链的进展。

    由于 promise 接口包含 .then() 以外的方法,因此还提供了更大的灵活性。

    也就是说,我以前没有看过 电锯,所以我还没有真正了解它的全部潜力。

    【讨论】:

    • 谢谢,但是,我知道通过 promises 我可以轻松地制作像 obj.function1().then(obj.function2) 这样的链,但我对流利的链更感兴趣。
    • 简短的回答是,promise 只公开 promise 方法,并且这些方法规定了链式语法。
    • 似乎当我调用 .then(obj.function2) 而 function2 执行“this context”时丢失了(“this”不引用 obj)
    • 看看我的问题的更新。不松散上下文链变得更加丑陋。
    • 我担心你是对的。这些功能变得分离,因此您需要采取防御措施来防止丢失上下文。例如,分配var self = this,并使用self,如this demo(jQuery 不是Q,虽然原理相同)。
    【解决方案2】:

    Deferred 实现允许您使用invoke 做一些接近的事情:

    obj.function1().invoke('function2').invoke('function3');
    

    当 ES6 代理成为现实时,有一个计划允许使用下面的代码实现相同的功能

    obj.function1().function2().function3();
    

    但我们还没有。

    另外值得注意的是Deferredpromise中的对象实际上是一个等于promise.then的函数。所以普通函数可以链接为:

    function1()(function2)(function3);
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-02
      • 1970-01-01
      • 2015-08-11
      • 1970-01-01
      • 2016-02-02
      • 1970-01-01
      • 2010-10-14
      • 2017-10-22
      相关资源
      最近更新 更多