const input = document.createElement("input");
input.type = "file";
document.body.append(input);
input.addEventListener("change", async event => {
const file = input.files[0];
const ab = await file.arrayBuffer();
const wa = CryptoJS.lib.WordArray.create(ab);
const hash = CryptoJS.MD5(wa);
console.log(hash.toString());
});
emn178/js-md5
, работает раз в 7 быстрее.CryptoJS.algo.MD5.create()
и методы update
и finalize
) const map = new Map();
for (const entry of components) {
const parent = map.get(entry.parentId);
if (parent) {
parent.children || (parent.children = []);
parent.children.push(entry);
}
map.set(entry.id, entry);
}
const rootItemId = 1;
console.log(map.get(rootItemId));
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
for (const span of h1.children) {
await sleep(500);
span.removeAttribute("hidden");
}
const h1 = document.querySelector("h1");
const chars = "HELLO".split("");
for (const char of chars) {
await sleep(500);
h1.textContent += char;
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
for (let i = 0; i < 10; i++) {
console.log(i);
await sleep(500);
}
async function change(params) {
try {
const response = await vk.call("groups.edit", {
group_id: 196543401,
screen_name: params
});
console.log(response);
console.log(response.getFullResponse());
} catch (error) {
console.log(error);
}
}
const array = fs.readFileSync("file.txt").toString().split("\n");
for (const item of array) {
console.log(item);
await change(item);
await sleep(1000);
}
Cannot use import statement outside a module
<script src="script.js" type="module"></script>
При выполнении в консоли команды node index.js я получаю ошибку:
To load an ES module, set"type": "module"
in thepackage.json
or use the .mjs extension
Как установить и настроить Vue.js?
npm create vite@latest my-vue-app -- --template vue
cd my-vue-app
npm install
npm run dev
yarn
(npm install --global yarn
) вместо npm
это будет заметно быстрее:yarn create vite my-vue-app --template vue
cd my-vue-app
yarn install
yarn run dev
server.open
в vite.config.js
import {defineConfig} from "vite";
import vue from "@vitejs/plugin-vue";
export default defineConfig({
plugins: [
vue(),
],
server: {
open: "/"
}
});
HelloWorld.vue
, в случае VSCode следует установить соответствующий плагин для код ассистанса, подсветки синтаксиса Vue 3. response.ok
не срабатывает, т.к. response.status.toString().startsWith("2") === false
{mode: "no-cors"}
Это условие скопировано с сайта javascript.ru.
let response = await fetch(url);
if (response.ok) { // если HTTP-статус в диапазоне 200-299
// получаем тело ответа (см. про этот метод ниже)
let json = await response.json();
} else {
alert("Ошибка HTTP: " + response.status);
}
Мне непонятно, почему этот код выводит 2
2 < 2 === false
, и второй цикл просто пропускается.2
и выводится.function isPrime(number) {
// ...
return true; // false
}
const max = 10;
for (let i = 0; i <= max; i++) {
if (isPrime(i)) {
alert(i);
}
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
for (let i = 0; i < 10; i++) {
for (let j = 5; j > 0; j--) {
console.log(i, j);
await sleep(500);
}
await sleep(2000);
}
fetch().then().then()
, собрав их в массиве.const promises /* !!! */ = json.dialogs.map((v) => {
let dialogId = v.dialogId;
return /* !!! */ fetch(`${this.WebApiHost}/api/qwe/dialogs/${dialogId}/${this.My_Token}`)
// ....
});
await Promise.allSettled(promises);
async
/await
и не использовать асинхронные функции в map
/forEach
:try {
const resp = await fetch("");
const json = await resp.json();
if (!json || json.error === true) {
console.log("error");
}
async function handleDialog(dialog) {
try {
const resp = await fetch("");
const json = await resp.json();
// ...
} catch (e) {
// ...
}
}
const concurrently = false;
if (concurrently) {
// [Way 1] Run one by one ---------
for (const dialog of []) {
await handleDialog(dialog);
}
} else {
// [Way 2] Run all concurrently ---
const promises = [];
for (const dialog of []) {
promises.push(handleDialog(dialog));
}
await Promise.allSettled(promises);
}
// The best way: concurrently with limitation
// @see https://qna.habr.com/q/1105356#answer_2098042
// ...
} catch (e) {
// ...
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
function download(blob, name, url) {
const anchor = document.createElement("a");
anchor.setAttribute("download", name || "");
const blobUrl = URL.createObjectURL(blob);
anchor.href = blobUrl + (url ? ("#" + url) : "");
anchor.click();
setTimeout(() => URL.revokeObjectURL(blobUrl), 5000);
}
url
(третий параметр) к blobUrl
, может потом пригодиться — посмотреть, откуда (по какой именно ссылке) файл был скачен.blob:https://imgur.com/11fb6df9-e45b-4acf-b3eb-60d5d4656747#https://i.imgur.com/X92aA5Y.jpeg
for (const url of urls) {
const resp = await fetch(url);
const blob = await resp.blob();
const name = new URL(url).pathname.match(/[^\/]*$/)[0];
download(blob, name, url);
await sleep(200);
}
arrayBuffer
у это объекта. event.target.files[0]
— это объект класса File
, который в свою очередь наследуется от класса Blob
. [somebody=John Doe]
[somebody="John Doe"]
class Semaphore {
constructor(max = 1) {
if (max < 1) { max = 1; }
this.max = max;
this.count = 0;
this.queue = [];
}
acquire() {
let promise;
if (this.count < this.max) {
promise = Promise.resolve();
} else {
promise = new Promise(resolve => {
this.queue.push(resolve);
});
}
this.count++;
return promise;
}
release() {
if (this.queue.length > 0) {
const resolve = this.queue.shift();
resolve();
}
this.count--;
}
}
const semaphore = new Semaphore(10);
for (const url of urls) {
await semaphore.acquire();
void downloadUrlSynchronized(url, semaphore);
}
async function downloadUrlSynchronized(url, semaphore) {
const resp = await fetch(url);
const blob = await resp.blob();
semaphore.release();
// const name = new URL(url).pathname.slice(1);
// downloadBlob(blob, name, url);
}
fetch
) будет не больше 10 в один момент, что собственно и требовалось.3
: