javascript - Pacta.js 中 $.when 的代数实现

标签 javascript jquery node.js promise algebraic-data-types

我正在写一个nodejs的东西,并尝试Pacta promise library为了娱乐。 Pacta 的界面是“代数的”,但我对此范式没有任何经验。

我想知道什么是“Pacta way”来完成与

相同的事情
$.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
}
也就是说,给定一个数组、一个返回 Promise 的迭代器函数和一个回调函数,我想将迭代器映射到数组上,并向回调提供解析值(或拒绝原因)的数组一旦所有的 promise 都得到解决。

如果没有一种惯用的代数方式来表达这一点,我也同样有兴趣知道这一点。

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

最佳答案

Pacta's interface is "algebraic," but I don't have any experience with that paradigm.

ADTs是表示嵌套数据类型的类型理论构造,例如 IntegerPromise。它们在函数式编程中大量使用,在这种风格中,您始终知道表达式和值的类型。不存在不透明的隐式类型强制,只有显式类型强制。

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

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

    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
    });
    
  • 如果您的回调确实返回 Promise,请使用 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)

  • 如果您的数组包含与普通值混合的 Promise,请使用以下内容:

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

    Promise.of(arrayOfThings[0]).…
    
  • 如果您的数组包含其他内容,即使 $.when 也不会执行您期望的操作。

当然,根本不支持使用多个值进行解析的 promise - 请改用数组。此外,只有当所有 promise 都履行时,您的回调才会被调用,而不是解决时,就像 jQuery 所做的那样。

关于javascript - Pacta.js 中 $.when 的代数实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28386411/

相关文章:

javascript - document.getElementById ("remember").visibility = "hidden";不在复选框上工作

javascript - 单击按钮元素时如何更新属性?

javascript - 根据 Angular js中的下拉选定值进行搜索

javascript - 使用 javascript/jquery 更改/添加 div 属性

javascript - jsp表单中的两个按钮和javascript表单验证

node.js - 关闭终端窗口后如何在 VSCode 中结束服务器

javascript - ECMAScript 5 'use strict' 字符串成本存在哪些?

javascript - 第二次单击按钮时验证不起作用

node.js - Nextjs 无法在生产 node_env 的 '.next' 目录中找到有效构建

javascript - JS Promise 在函数之间传递/等待 Promise