- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在写一个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是表示嵌套数据类型的类型理论构造,例如 Integer
的 Promise
。它们在函数式编程中大量使用,在这种风格中,您始终知道表达式和值的类型。不存在不透明的隐式类型强制,只有显式类型强制。
这与 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/
我正在写一个nodejs的东西,并尝试Pacta promise library为了娱乐。 Pacta 的界面是“代数的”,但我对此范式没有任何经验。 我想知道什么是“Pacta way”来完成与 相
我是一名优秀的程序员,十分优秀!