在异步函数(javaScript - node v8.4.0)中等待多个promises抛出拒绝错误后,我遇到了捕获所有错误的问题.
参考以下javaScript:
作为参考,函数timeoutOne()和timeoutTwo()只返回一个本机promise,它分别在1秒和2秒超时后解析一个值,如果我将"deviousState"设置为true,则拒绝并返回错误.
let deviousState = true;
async function asyncParallel() {
try {
let res1 = timeoutOne();
let res2 = timeoutTwo();
console.log(`All done with ${await res1} ${await res2}`)
}
catch(err) {
console.log(err)
}
}
asyncParallel();
let pAll = Promise.all([timeoutOne(), timeoutTwo()]);
pAll.then((val) => {
console.log(`All done with ${val[0]} ${val[1]}`)
}).catch(console.log);
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,只有返回的promise才会记录错误.我知道在一些promise库中有一种记录所有错误的方法(例如bluebird中的"sett"方法),但是,我不确定在本机承诺中是否存在这种方法的类似物?
此外,如果两个promise都拒绝,则asyncParallel()会记录一个未被捕获的错误,其中包含拒绝最后的承诺.那是因为async函数的try/catch块没有内置机制来以这种方式捕获多次拒绝吗?
如果承诺解决了,两种情况下的一切都是一样的.只是当两者都拒绝时,Promise.all处理错误,而async函数版本声明其中一个未处理的promise错误将使节点的未来版本中的进程崩溃.
无论如何,try/catch是否正确处理此类错误?或者我是否仍然需要在异步函数中使用Promise.all以确保错误得到正确处理?
我试图了解在React(版本16+)内使用类似游戏循环之类的细微差别。我对React的渲染策略如何与另一个渲染调度程序发生冲突(或不发生冲突)感到困惑-在这种情况下:请求动画帧。
请参考以下示例,其中使用游戏循环来设置状态:
class Loop extends Component {
constructor(props) {
super(props);
this.state = { x: 0 };
}
componentDidMount() {
let then = performance.now();
const loop = now => {
if (this.state.x < 400)
window.requestAnimationFrame(loop);
const dt = now - then;
then = now;
this.setState(prevState => ({ x: prevState.x + (dt * 0.1) }));
};
loop(then);
}
render() {
const { x } = this.state;
return <div style={{
backgroundColor: "green",
height: "50px",
width: `${x}px`
}}></div>;
}
}
Run Code Online (Sandbox Code Playgroud)
这是否会类似于直接操作DOM的工作?还是会做出诸如批处理状态更新之类的渲染操作,从而违反使用请求动画帧的目的?
截至目前(2018),当您使用默认设置设置 luminus 模板项目时,使用的 http/tcp 服务器是什么?
我读到 luminus 使用 immutant,但是,immutant 是其他东西的集合。我还读到,immutant 中使用的底层服务器是 undertow。
我假设默认服务器处于低潮状态是否正确?如果是这样,默认设置对于非阻塞 IO 的执行情况如何?该服务器是否提供像 nginx/nodejs 这样的非阻塞事件循环架构?
我正在研究 webpack 中基于承诺的动态导入:
import('chunk').then(chunk => {...do something with chunk...})。
在这种情况下,webpack 有办法消除死代码吗?似乎整个 esModule 都是默认导入的,而没有提前指定您需要什么。
更新
澄清一下,当您只需要模块“A.js”中的函数“f”时,您可以像这样动态导入它:
import('A.js').then(({f}) => {...})
Run Code Online (Sandbox Code Playgroud)
这是以下的动态模拟:
import {f} from 'A.js'
Run Code Online (Sandbox Code Playgroud)
然而,据我所知,webpack 无法通过在动态版本中修剪“A.js”中不需要的函数来优化捆绑包,即使我只解构并使用其中之一,我总是会得到整个模块可能的出口。
这只是 webpack 对动态加载模块的死代码检测的限制吗?
我正在玩clojure宏,我发现很多宏行为我可以用函数组合进行复制.
一个很好的例子是线程宏:
(defn add1 [n] (+ n 1))
(defn mult10 [n] (* n 10))
(defn threadline [arg]
(-> arg
add1
mult10))
Run Code Online (Sandbox Code Playgroud)
我可以使用像管道这样的更高阶函数轻松复制这个:
(defn pipe [& fns]
(reduce (fn [f g] (fn [arg] (g(f arg)))) fns))
(def pipeline
(pipe
#(+ % 1)
#(* % 10)))
Run Code Online (Sandbox Code Playgroud)
必须存在无法用函数替换宏的情况.我想知道是否有人有这些情况的好例子,以及所涉及的重复主题.
我试图围绕RxJs运算符的用例,groupBy我担心在某些情况下它可能会导致内存泄漏.
我熟悉传统意义上的groupBy(例如同步列表处理).我将写出一个groupBy函数来引用:
const groupBy = f => list =>
list.reduce((grouped, item) => {
const category = f(item);
if (!(category in grouped)) {
grouped[category] = [];
}
grouped[category].push(item);
return grouped;
}, {});
const oddsAndEvens = x => x % 2 === 0 ? 'EVEN' : 'ODD';
compose(
console.log,
groupBy(oddsAndEvens)
)([1,2,3,4,5,6,7,8])
// returns: { ODD: [ 1, 3, 5, 7 ], EVEN: [ 2, 4, 6, 8 ] }
Run Code Online (Sandbox Code Playgroud)
请注意,这在更广泛的范围内是无状态的.我假设RxJs做了类似于此的事情,在EVEN和ODD的位置会返回observables,并且它会在一些行为类似于集合的状态中跟踪状态.如果我错了,请纠正我,重点是我认为RxJs必须维护所有分组的有状态列表.
我的问题是,如果分组值的数量(本例中只是偶数和奇数)不是有限的,会发生什么?例如,一个流,它为您提供唯一标识符,以保持流的生命周期的一致性.如果你按照这个标识符进行分组,那么RxJs的groupBy运算符会不断创建越来越多的组,即使再次重新访问旧的标识符也是如此?
以下对 compose 函数的 Hindley-Milner 类型签名的尝试是否正确?
// compose :: (f -> [f]) -> (f -> f -> f) -> [f] -> f
const compose = (...fns) => fns.reduce((f,g) => (...args) => f(g(...args)));
Run Code Online (Sandbox Code Playgroud) 我第一次使用 indexedDB,mozilla 文档指出错误一直冒泡到“数据库”实例。
我的理解是,这个系统中的事件传播完全继承自 DOM 事件模型。
我很好奇这是否意味着错误会一直冒泡到 IDBOpenDBRequest(用 indexedDB.open() 实例化)。
该文档指出,您可以将 onerror 事件处理程序附加到顶级 IDB 实例,并且它可以在一个处理程序中拦截您的所有错误。如果将其附加到 IDBOpenDBRequest,这对我来说更有意义,因为它确实处于最高级别。但是,它的解释方式听起来好像实际上是 IDBDatabase 是冒泡线的末端?
clojure ×2
javascript ×2
async-await ×1
es6-promise ×1
http ×1
indexeddb ×1
luminus ×1
macros ×1
reactjs ×1
rxjs ×1
webpack ×1