Javascript Pacta.js中$的代数实现
我正在写一篇关于nodejs的文章,并且试着用它来取乐。Pacta的界面是“代数的”,但我对这种模式没有任何经验 我想知道什么是“Pacta方式”来完成与之相同的事情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
$.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:你说得对(大部分)。非常重要的是,数组能够包含一些非承诺值,并且这些值只需传递给回调(如有必要,透明地将它们包装在已经实现的承诺中)。谢谢!这正是我希望得到的信息。