小编MFa*_*ave的帖子

在JavaScript中的异步函数中捕获所有承诺拒绝

在异步函数(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以确保错误得到正确处理?

javascript error-handling async-await es6-promise

8
推荐指数
1
解决办法
2万
查看次数

反应:如果在请求动画帧中设置了状态,会在动画帧上反应计划渲染吗?

我试图了解在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的工作?还是会做出诸如批处理状态更新之类的渲染操作,从而违反使用请求动画帧的目的?

requestanimationframe reactjs

6
推荐指数
1
解决办法
2380
查看次数

Clojure:luminus 框架的默认服务器是什么?

截至目前(2018),当您使用默认设置设置 luminus 模板项目时,使用的 http/tcp 服务器是什么?

我读到 luminus 使用 immutant,但是,immutant 是其他东西的集合。我还读到,immutant 中使用的底层服务器是 undertow。

我假设默认服务器处于低潮状态是否正确?如果是这样,默认设置对于非阻塞 IO 的执行情况如何?该服务器是否提供像 nginx/nodejs 这样的非阻塞事件循环架构?

http clojure luminus

5
推荐指数
1
解决办法
404
查看次数

Webpack:树摇动可以应用于预处理动态导入吗?

我正在研究 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 对动态加载模块的死代码检测的限制吗?

dynamic-import webpack

5
推荐指数
0
解决办法
604
查看次数

Clojure宏:什么时候函数不能复制宏的行为?

我正在玩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)

必须存在无法用函数替换宏的情况.我想知道是否有人有这些情况的好例子,以及所涉及的重复主题.

macros clojure

3
推荐指数
1
解决办法
171
查看次数

RxJs操作员组可以泄漏内存吗?

我试图围绕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运算符会不断创建越来越多的组,即使再次重新访问旧的标识符也是如此?

functional-programming reactive-programming rxjs

2
推荐指数
1
解决办法
314
查看次数

函数式 JavaScript:Compose 的 Hindley-Milner 类型签名是什么?

以下对 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)

javascript functional-programming hindley-milner

1
推荐指数
1
解决办法
443
查看次数

IndexedDB - 错误会一直冒泡到 IDBOpenDBRequest 吗?

我第一次使用 indexedDB,mozilla 文档指出错误一直冒泡到“数据库”实例。

我的理解是,这个系统中的事件传播完全继承自 DOM 事件模型。

我很好奇这是否意味着错误会一直冒泡到 IDBOpenDBRequest(用 indexedDB.open() 实例化)。

该文档指出,您可以将 onerror 事件处理程序附加到顶级 IDB 实例,并且它可以在一个处理程序中拦截您的所有错误。如果将其附加到 IDBOpenDBRequest,这对我来说更有意义,因为它确实处于最高级别。但是,它的解释方式听起来好像实际上是 IDBDatabase 是冒泡线的末端?

event-handling indexeddb

1
推荐指数
1
解决办法
113
查看次数