小编kam*_*uel的帖子

如何顺序执行promises,从数组传递参数?

var myArray = [1, 2, 3, 4, 5, 6]

function myPromise(num){
  return new Promise(res => {
    window.setTimeout(()=>{
      res(  console.log("done: " + num)  )
    },2000)
  })
}


myPromise(myArray[0])
  .then(x => myPromise(myArray[1]))
  .then(x => myPromise(myArray[2]))
  .then(x => myPromise(myArray[3]))
  .then(x => myPromise(myArray[4]))
  .then(x => myPromise(myArray[5]))
Run Code Online (Sandbox Code Playgroud)

现在,如果我执行上面的语句,它将按顺序运行.在我的实际用例中,数组是动态填充的,我需要myPromise()为每个成员执行该函数myArray.

我如何创建一个"可暂停的循环",它将为数组中的每个项循环,执行myPromise并等待承诺得到解决,然后再继续下一次迭代?

javascript

20
推荐指数
5
解决办法
2万
查看次数

单独的影子根中是否允许重复 ID?

tl;博士:

  1. 只要两个元素都在单独的影子根下,具有相同 ID 属性的两个元素是否有效?
  2. aria-labelledby在这种情况下,屏幕阅读器会正确处理吗?

例如,考虑这个自定义元素:

(function () {
  let template = document.createElement('template')
  template.innerHTML = `
    <svg viewBox="0 0 206 74"
         fill="none"
         xmlns="http://www.w3.org/2000/svg"
         role="img"
         aria-labelledby="logo-title">
      <title id="logo-title"><slot>Logo of Some Company.</slot></title>

      <path d="..." fill="..."/>
    </svg>
  `

  class Logo extends HTMLElement {
    constructor () {
      super()

      let shadowRoot = this.attachShadow({mode: 'open'})
      shadowRoot.appendChild(template.content.cloneNode(true))
    }
  }

  customElements.define('company-logo', Logo)
})()

Run Code Online (Sandbox Code Playgroud)

这样做是否有效:

<company-logo>
  Title One.
</company-logo>

<company-logo>
  Some other title.
</company-logo>
Run Code Online (Sandbox Code Playgroud)

这会是一个有效的 DOM,即使两者<title>共享相同的 ID?屏幕阅读器会为第一个徽标读“标题一”,为第二个徽标读“其他标题”吗?

html accessibility shadow-dom custom-element

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

事务中的deref可能会触发重试 - ref状态历史的作用是什么?

"Clojure编程"(Emerick,O'Reilly)指出:

(...)如果一个新值如果从当前事务开始以来由另一个事务提交,则不能提供在事务开始时的ref的新值.有帮助的是,STM注意到了这个问题并维护了事务中涉及的ref状态的有界历史,其中历史的大小随每次重试而增加.这增加了 - 在某些时候 - 交易将不再需要重试的机会,因为,当ref被更新地更新时,期望的值仍然存在于历史中.

接下来,他们提供一些代码示例来说明问题.

首先,说明只有在完成所有编写器事务之后,读取事务才会成功(因此a = 500):

(def a (ref 0))
(future (dotimes [_ 500] (dosync (Thread/sleep 20) (alter a inc))))
@(future (dosync (Thread/sleep 1000) @a))
; 500
(ref-history-count a)
; 10
Run Code Online (Sandbox Code Playgroud)

第二,说明设置:min-history:max-history可以帮助读取器事务重试(此时a已成功读取 - 值33):

(def a (ref 0 :min-history 50 :max-history :100))
(future (dotimes [_ 500] (dosync (Thread/sleep 20) (alter a inc))))
@(future (dosync (Thread/sleep 1000) @a))
; 33
Run Code Online (Sandbox Code Playgroud)

我确实理解为什么deref读者内部事务导致它重试(当某些编写器事务正在提交对ref的更改时).我不明白的是这一部分:"这增加了 - 在某些时候 - 交易不再需要重试的机会,因为,当ref得到最新更新时,所需的值仍然存在于历史中".

什么是"期望值"?在上面的例子中,ref历史如何随时间变化?有人可以给我一个解释或一些示例,时间表显示ref历史是如何工作的吗?

clojure stm

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

试剂输入未更新

我正在尝试用Reagent/React构建一个Hello World应用程序.我使用:value/ :on-changecombo 将输入与原子绑定.但是,当我输入时,输入仍为空:

(defn new-user []
  ; Atom declared in an inner `let`.
  (let [v (atom "")]
    [:div
     [:input {:type "text"
              :value @v
              :on-change (fn [evt]
                           (reset! v (-> evt .-target .-value)))
              }]]))

(defn app [state]
  [:div
   [:p "State" (pr-str @app-state)]
   [new-user]])

(r/render-component [app app-state]
                    (.-body js/document))
Run Code Online (Sandbox Code Playgroud)

如果我将原子移出let,它将起作用:

; Atom is now top-level.
(defonce v (atom ""))

(defn new-user []
  [:div
   [:input {:type "text"
            :value @v
            :on-change (fn [evt]
                         (reset! v (-> evt .-target …
Run Code Online (Sandbox Code Playgroud)

clojurescript reactjs reagent

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

在测试中禁用React的CSSTransitionGroup

我在CSSTransitionGroup元素出现在DOM中时,或者当它离开DOM时,我用它来动画.它运作良好.

现在 - 我想对这个组件进行单元测试.我正在创建一个临时DOM节点,我将它附加到<body>,我将我的组件渲染到它,然后我执行一些操作.因此,我希望子DOM节点消失.

问题:应用 动画类,组件保留在DOM中,直到CSS动画结束.这意味着我的测试也应该等待几百毫秒才能断言该元素消失.我不能这样做 - 我希望我的测试很快,因为那些是单元测试.

问题: 有没有办法在不向组件添加额外选项的情况下禁用CSS过渡?

我尝试过: 单元测试本身运行良好.我可以通过将参数传递给我的组件来摆脱动画,这将使它不被使用CSSTransitionGroup.所以 - 最糟糕的情况 - 我会做到这一点.但我正在寻找更好的解决方案.

我还可以断言"-enter"/" - enter-active"/" - leave"/" - leave-active"类存在于有问题的元素上.这看起来有点像hacky,因为我可以想象一个应用这些类的错误,但是元素将保留在DOM中.我宁愿不采用这种方法.

unit-testing reactjs reactcsstransitiongroup

8
推荐指数
3
解决办法
2610
查看次数

Clojure让vs Common Lisp让

在Common Lisp中,let使用绑定列表,即:

(let ((var1 1)
      (var2 2))
  ...)
Run Code Online (Sandbox Code Playgroud)

虽然Clojure使用向量代替:

(let [a 1
      b 2]
  ...)
Run Code Online (Sandbox Code Playgroud)

除了可读性之外,Clojure使用向量是否有任何具体原因?

lisp clojure common-lisp let

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

使ClojureScript编译器输出多个独立的.js文件,以便在赛普拉斯中使用

我正在尝试使用ClojureScript编写用于使用的项目的赛普拉斯测试lein-cljsbuild.使用以下配置,我能够将单个测试命名空间编译为单个.js文件:

:cljsbuild
  {:builds [{:id "cypress"
             :source-paths ["test/cypress"]
             :compiler     {:optimizations :simple
                            :main          "specs.login-spec"
                            :output-to     "cypress/integration/login_spec.js"
                            :output-dir    "test-resources/cypress/js/build/"}}]}
Run Code Online (Sandbox Code Playgroud)

以上工作正常,并在赛普拉斯正确执行.

现在我想缩放它.这是我的要求:

  • 已经写了多规格在ClojureScript: ,specs.login-spec,specs.shopping-cart-spec,specs.checkout-spec等等(我希望有几十那些).
  • 我希望赛普拉斯将它们识别为独立的测试套件(例如,我可以独立执行它们).这意味着每个ClojureScript测试命名空间必须以独立的JS文件结束,即不依赖于任何其他JS文件.
  • 我希望能够合理地快速编译所有规格.
  • 我希望源代码可以通过简单的设置获得,即lein cljsbuild auto …应该仍然有效,并使用增量构建.

我该如何做到这一点?

最天真的方法是为每个规范指定一个构建计划.但这意味着对于N规格,我需要运行编译N次.那将是非常缓慢的.

突然出现在我脑海中的另一个想法是ClojureScript模块,但以下设置会发出空文件:

{:id "cypress"
 :source-paths ["test/cypress"]
 :compiler {:optimizations :simple
            :output-dir    "test-resources/cypress/js/build/"
            :modules {:m1 {:output-to "cypress/integration/login_spec.js"
                           :entries #{"specs.login-spec"}}
                      :m2 {:output-to "cypress/integration/checkout_spec.js"
                           :entries #{"specs.checkout-spec"}}}}}
Run Code Online (Sandbox Code Playgroud)

我的spec文件现在非常简单 - 单独地,它们在赛普拉斯编译和运行就好了.例:

(ns specs.login-spec
  (:require [tools.commands]
            [tools.interop :refer [cy describe it]]))

(describe "Lorem" (fn []
  (describe "Ipsum" (fn …
Run Code Online (Sandbox Code Playgroud)

compilation leiningen clojurescript cypress

6
推荐指数
0
解决办法
185
查看次数

在不同实例之间共享nodejs中的对象

我需要在不同节点进程或集群之间共享一些对象或完整模块,我搜索了很多博客但没有得到满意的答案。

如果这是不可能做到的,那么有什么想法可以解决这个问题吗?

javascript node.js

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

在30分钟视频FFMPEG中,1500帧的图像序列循环30次

真的很难让这个工作,我只需要循环一个图像序列.它是25fps,持续时间恰好是一秒(1500)我需要这个基本上循环30分钟,所以它将循环30次.使用FFMPEG,这里是工作的1500帧转换为MP4,就像我说它必须是30分钟长度:

ffmpeg -i "input_%04d.jpg" -c:v libx264 -b:v 1M -s 1080x810 -crf 28 -r 25 -pix_fmt yuv420p out.mp4
Run Code Online (Sandbox Code Playgroud)

ffmpeg infinite-loop

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

未捕获的SyntaxError:意外的标记<angular.1-2-13.min.js:1

我是角度jS和while的新手.我正在使用节点服务器在本地部署我的应用程序.在Chrome浏览器中面对此错误.

PFB我的代码

Demo.html

<html ng-app="Demo">
<head>
<script type="text/javascript" src="lib/angular.1-2-13.min.js"></script>
<script type="text/javascript" src="lib/angular-route.1-2-13.min.js">         </script>
</head>
<body ng-controller="DemoController">

USA<input type='radio' name='txt1' ng-model="value" ng-         change="changeValue(value)" value="USA"> Non-USA<input type='radio'   name='txt1' ng-model="value" ng-change="changeValue(value)" value="NUSA">

<select ng-model="selectedItem" ng-options='option.name for option in optionValues'>
</select>
<input type='text' name='txt1' ng-model='txtValue'/>
<input type='button' name='b1' ng-click='takeValue(txtValue)'/>
<a href="#/about">routing</a>
<div ng-view></div>

<script type="text/javascript">
var demo = angular.module( "Demo", ['ngRoute'] );

demo.config(['$routeProvider','$locationProvider', function        ($routeProvider,$locationProvider) {
$routeProvider
// Pages
.when("/about", {templateUrl:      "/Users/smundhe/Desktop/NewProject/Demo2.html",controller:   "Demo2Controller"})
// else 404
.otherwise("/404", {templateUrl: "partials/404.html",controller:  "PageCtrl"});
//$locationProvider.html5Mode(true);
 }]);

demo.controller(
        "DemoController", …
Run Code Online (Sandbox Code Playgroud)

angularjs

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

为什么编译器认为这个函数是非尾递归的?

我正在解决OCaml 教程之一中发布的问题。其中之一是编写一个函数来计算列表的长度。它应该是尾递归的。

朴素的非尾递归解决方案是:

let rec length_naive xs  = (** Not tail recursive *)
  match xs with
  | [] -> 0
  | _ :: xs -> 1 + length_naive xs;;

(length_naive [@tailcall]) [1, 2, 3, 4];;

let one_hundred_million = 100000000;;
let non_tail_result = length_naive(List.init one_hundred_million (Fun.id));;
print_endline("Non-tail-recursive result: " ^ string_of_int(non_tail_result));;
Run Code Online (Sandbox Code Playgroud)

编译和运行它完全按照预期工作。打印警告(由于@tailcall),并且由于堆栈溢出而执行失败:

$ ocamlc lib/so.ml
File "lib/so.ml", line 14, characters 0-39:
14 | (length_naive [@tailcall]) [1, 2, 3, 4];;
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Warning 51 [wrong-tailcall-expectation]: expected tailcall

$ ./a.out …
Run Code Online (Sandbox Code Playgroud)

ocaml tail-recursion

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