Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Pacta.js中$的代数实现_Javascript_Jquery_Node.js_Promise_Algebraic Data Types - Fatal编程技术网

Javascript Pacta.js中$的代数实现

Javascript Pacta.js中$的代数实现,javascript,jquery,node.js,promise,algebraic-data-types,Javascript,Jquery,Node.js,Promise,Algebraic Data Types,我正在写一篇关于nodejs的文章,并且试着用它来取乐。Pacta的界面是“代数的”,但我对这种模式没有任何经验 我想知道什么是“Pacta方式”来完成与之相同的事情 $.when.apply(undefined, arrayOfThings) .then(function onceAllThingsAreResolved(thing1Val, thing2Val, ...) { // code that executes once all things have been coerce

我正在写一篇关于nodejs的文章,并且试着用它来取乐。Pacta的界面是“代数的”,但我对这种模式没有任何经验

我想知道什么是“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
}
也就是说,给定一个数组、一个返回承诺的迭代器函数和一个回调函数,我想将迭代器映射到数组上,并在所有承诺都得到解决后向回调提供一个解析值数组(或拒绝原因)

如果没有一个惯用的代数方法来表达这一点,我也很想知道

编辑:根据@Bergi更新了$.when的用法,以正确容纳数组

Pacta的界面是“代数的”,但我对这种模式没有任何经验

是表示嵌套数据类型的类型理论构造,如
整数的
承诺。它们在函数式编程中大量使用,在函数式编程中,您总是知道表达式和值的类型。没有不可持久的隐式类型强制,只有显式类型强制

这与jQuery的方法完全相反,在jQuery中,
$.when()
.then()
根据其参数的类型(和数量)做完全不同的事情。因此,翻译代码有点复杂。诚然,Pacta没有最有用的实现,因此我们必须使用一些自己的助手函数来实现这一点

  • 假设您有一个(多个)承诺数组,并且您的
    回调接受参数并返回一个非承诺值:

    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
    });
    
    如果不知道返回的内容,请使用
    然后
    而不是
    。如果您不知道它返回什么,并且希望获得多个参数,请使用
    .spread(…).then(identity)

  • 如果数组包含与普通值混合的承诺,请使用以下命令:

    arrayOfThings.reduce(function(arrp, val) {
        var p = new Promise();
        Promise.resolve(p, val);
        return arrp.append(p);
    }, Promise.of([])).…
    
  • 如果数组仅包含单个值或不包含(不可编辑)值,请使用

    Promise.of(arrayOfThings[0]).…
    
  • 如果您的数组包含任何其他内容,即使是
    $。when
    也不会达到预期效果


当然,根本不支持使用多个值进行解析的承诺——而是使用数组。此外,只有当所有承诺都兑现时,才会调用您的回调,而不是在承诺兑现时,正如jQuery所做的那样。

Patca只有4个问题,一年内从未被提及,每月下载量不足200次。我怀疑是否存在“Pacta方式”:D@BenjaminGruenbaum:准予;但也许有一种“代数方法”Pacta实现了对的支持。Pacta代数化的意义在于它如何与其他同样是代数的库和工具一起工作——就其本身而言,没有理由不使用像native Promissions那样的
all
方法——在这一点上,没有什么比这更代数化的了——例如,Haskell的异步模块很高兴地包括这样的方法waitAny操作列表。您确定是指
$。何时(arrayOfThings)
?我想你的意思是
jQuery.when.apply(null,arrayOfPromises)
@Bergi:你说得对(大部分)。非常重要的是,数组能够包含一些非承诺值,并且这些值只需传递给回调(如有必要,透明地将它们包装在已经实现的承诺中)。谢谢!这正是我希望得到的信息。