2013-05-21 43 views
1

什麼是建立在Javascript流暢接口(node.js中)與異步的JavaScript流利(節點)接口(使用deferreds)

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

其中函數是異步方法的最佳方法是什麼?

有一個叫電鋸模塊,但如果是possilble做deferreds和承諾(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 
}) 

回答

0

Deferred實現允許你做一些親密,與invoke

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

當ES6代理將成爲現實,還有一個計劃,讓下面的代碼相同的功能

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

但我們還沒有。

另外值得注意的是,在Deferredpromise對象實際上是一個函數,它等於promise.then。所以,純函數可以爲被鏈接:。

function1()(function2)(function3); 

我希望這是有益的

1

是的,好樣的。鏈將需要不同的方式構造:

obj.function1().then(obj.function2).then(obj.function3); 
  • function1需要返回解析/分辨的承諾。

  • function2(或所有中間函數)需要返回結果或新的已解決/可解析的承諾。

  • function3(或無論哪個功能最後)都需要對鏈中早期函數的累積結果做一些事情 - 即。它必須是一個「消費者」功能。

由於承諾有排斥反應機制以及分辨率,承諾鏈提供比電鋸更大的內在可能性,允許/終止環比下跌的進展。

由於承諾接口包括.then()以外的方法,因此還提供了更大的靈活性。

這就是說,我沒有看過鏈鋸之前,所以我沒有真正把我的想法發揮到最大的潛力。

+0

謝謝,但據我所知,有承諾,我可以很容易地做出這樣obj.function1鏈(),然後(obj.function2),但我對流利的鏈條更感興趣。 – WHITECOLOR

+0

簡單的答案是承諾只暴露承諾方法,並且這些方法規定鏈式語法。 –

+0

看來,當我調用.then(obj.function2)而執行「this context」的函數2丟失(「this」並不指obj) – WHITECOLOR