2015-02-07 55 views
0

我正在寫一個nodejs的東西,並嘗試Pacta promise library的樂趣。 Pacta的界面是「代數」的,但我對這個範例沒有任何經驗。

我想知道什麼是「約定必須的方式」來完成同樣的事情

$.when.apply(undefined, arrayOfThings) 
.then(function onceAllThingsAreResolved(thing1Val, thing2Val, ...) { 
    // code that executes once all things have been coerced to settled promises 
    // and which receives ordered resolution values, either as 
    // separate args or as a single array arg 
} 

也就是說,給定一個數組,返回一個承諾一個迭代函數,一個回調函數,我想將迭代器映射到數組上,並在所有的承諾都已解決後向回調提供解析值數組(或拒絕原因)。

如果沒有一種通俗的代數方式來表達這一點,我會同樣感興趣地知道這一點。

編輯:更新使用$ .when以正確容納數組,每@Bergi。

+0

Patca只有過4期,一年沒有被觸及,一個月下載量不到200次。我懷疑是否有「Pacta方式」:D – 2015-02-07 20:42:41

+0

@BenjaminGruenbaum:授予;但也許有一種Pacta實現支持的「代數方法」。 – Tom 2015-02-07 21:02:14

+0

Pacta作爲代數的一點在於它如何與其他庫和代數工具一起工作 - 本身沒有理由不需要像本機承諾那樣的「全部」方法 - 這裏沒有什麼代數 - Haskell的例如異步模塊很樂意包含像waitAny這樣的在列表上運行的方法。 – 2015-02-07 22:14:19

回答

2

Pacta的界面是「代數」的,但我對這個範例沒有任何經驗。

ADTs是表示嵌套的數據類型,如一個爲Promise類型Integer理論構建體。它們大量用於函數式編程,這是一種總是知道表達式和值的類型的風格。沒有不透明的,隱式類型的強制,但只有明確的強制。

這與jQuery的方法完全相反,其中$.when().then()根據其參數的類型(和數量)完全不同。因此,翻譯你的代碼有點複雜。無可否認,Pacta沒有最有用的實現,因此我們必須使用一些自己的幫助函數來完成此操作。

  • 假設你有一個(多個)承諾的數組,你then回調需要的參數,並返回一個非承諾值:

    arrayOfPromises.reduce(function(arr, val) { 
        return arr.append(val); 
    }, Promise.of([])).spread(function (…args) { 
        // code that executes once all promises have been fulfilled 
        // and which receives the resolution values as separate args 
    }); 
    
  • 如果回調不採取多個參數,使用map代替spread

    arrayOfPromises.reduce(function(arrp, valp) { 
        return arrp.append(valp); 
    }, Promise.of([])).map(function (arr) { 
        // code that executes once all promises have been fulfilled 
        // and which receives the resolution values as an array 
    }); 
    
  • 如果回調不返回親瀨,使用chain代替map

    arrayOfPromises.reduce(function(arr, val) { 
        return arr.append(val); 
    }, Promise.of([])).chain(function (arr) { 
        // code that executes once all promises have been fulfilled 
        // and which receives the resolution values as an array 
    }); 
    

    如果你不知道它返回,用then代替chain。如果您不知道它返回的內容並希望獲得多個參數,請使用.spread(…).then(identity)

  • 如果陣列包含許使用普通值混合,使用以下:

    arrayOfThings.reduce(function(arrp, val) { 
        var p = new Promise(); 
        Promise.resolve(p, val); 
        return arrp.append(p); 
    }, Promise.of([])).… 
    
  • 如果陣列中只包含一個或無(非thenable)值,使用

    Promise.of(arrayOfThings[0]).… 
    
  • 如果你的數組包含其他任何內容,即使$.when也不會達到你所期望的。

當然,不支持使用多個值解析的promise--使用數組代替。此外,只有當所有承諾爲滿足,而不是當他們是結算時,纔會調用您的回調,就像jQuery所做的那樣。

+0

謝謝!這正是我所希望的那種信息。 – Tom 2015-02-14 18:31:01