JavaScript
31.6K subscribers
1.17K photos
10 videos
33 files
842 links
A resourceful newsletter featuring the latest and most important news, articles, books and updates in the world of #javascript ๐Ÿš€ Don't miss our Quizzes!

Let's chat: @nairihar
Download Telegram
CHALLENGE


async function fetchData(id) {
if (id < 0) throw new Error("Invalid ID");
return { id, value: id * 10 };
}

async function process() {
const results = await Promise.allSettled([
fetchData(1),
fetchData(-1),
fetchData(3),
]);

results.forEach(({ status, value, reason }) => {
if (status === "fulfilled") {
console.log(`fulfilled: ${value.id} -> ${value.value}`);
} else {
console.log(`rejected: ${reason.message}`);
}
});
}

process();
โค4๐Ÿ‘3๐Ÿค”2
๐ŸคŸ Whatโ€™s Actually New in JavaScript (And Whatโ€™s Coming Next)

If you donโ€™t read the specs or endless posts about new language features, this is a great way to catch up. Most of the features are supported in Node, like Promise.try, Set union/intersection/difference, Array.fromAsync, and using, with others soon to land, like Math.sumPrecise and Map.getOrInsert (in Node 26).

Neciu Dan
Please open Telegram to view this post
VIEW IN TELEGRAM
โค7๐Ÿ”ฅ3๐Ÿ‘2๐Ÿค”1๐Ÿคฉ1
CHALLENGE


const EventEmitter = (() => {
const listeners = new WeakMap();

return class {
constructor() {
listeners.set(this, {});
}

on(event, fn) {
const map = listeners.get(this);
(map[event] ??= []).push(fn);
return this;
}

emit(event, ...args) {
const map = listeners.get(this);
(map[event] ?? []).forEach(fn => fn(...args));
return this;
}
};
})();

const bus = new EventEmitter();
const log = [];

bus
.on("data", val => log.push(`A:${val}`))
.on("data", val => log.push(`B:${val}`))
.on("done", () => log.push("done"));

bus.emit("data", 1).emit("data", 2).emit("done");

console.log(log.join(" | "));
โค4๐Ÿ”ฅ1
CHALLENGE


class Vehicle {
#speed = 0;

constructor(brand) {
this.brand = brand;
}

accelerate(amount) {
this.#speed += amount;
return this;
}

getSpeed() {
return this.#speed;
}

toString() {
return `${this.brand} @ ${this.#speed}km/h`;
}
}

class Car extends Vehicle {
#gear = 1;

constructor(brand, model) {
super(brand);
this.model = model;
}

shiftUp() {
this.#gear++;
return this;
}

toString() {
return `${super.toString()} [Gear ${this.#gear}]`;
}
}

const car = new Car("Toyota", "Supra");
car.accelerate(60).accelerate(40).shiftUp().shiftUp();

console.log(car.toString());
console.log(car instanceof Car);
console.log(car instanceof Vehicle);
console.log(Object.getPrototypeOf(Car) === Vehicle);
โค2๐Ÿ‘1
CHALLENGE

const delay = (ms, val) => new Promise(res => setTimeout(res, ms, val));

async function pipeline(...fns) {
return async (input) => {
let result = input;
for (const fn of fns) {
result = await fn(result);
}
return result;
};
}

const double = async (x) => delay(10, x * 2);
const addTen = async (x) => delay(10, x + 10);
const square = async (x) => delay(10, x ** 2);

(async () => {
const process = await pipeline(double, addTen, square);
const output = await process(3);
console.log(output);
})();
โค1๐Ÿ‘1๐Ÿ”ฅ1
What is the output?
Anonymous Quiz
29%
256
49%
1024
16%
196
5%
324
โค1๐Ÿ”ฅ1
CHALLENGE


const inventory = new Map([
["sword", { quantity: 3, weight: 15 }],
["shield", { quantity: 1, weight: 25 }],
["potion", { quantity: 10, weight: 2 }],
]);

inventory.set("bow", { quantity: 2, weight: 8 });
inventory.delete("shield");

const totalWeight = [...inventory.entries()].reduce((acc, [item, { quantity, weight }]) => {
return acc + quantity * weight;
}, 0);

const heaviestItem = [...inventory.entries()].reduce((max, [item, data]) =>
data.weight > max.weight ? { name: item, ...data } : max,
{ name: "", weight: 0 }
);

console.log(inventory.size, totalWeight, heaviestItem.name);
โค2๐Ÿ‘2
โค3๐Ÿ‘2
CHALLENGE

const ops = {
add: (a, b) => a + b,
subtract: (a, b) => a - b,
multiply: (a, b) => a * b,
divide: (a, b) => b !== 0 ? a / b : NaN,
};

const pipeline = (...fns) => (value) => fns.reduce((acc, fn) => fn(acc), value);

const double = (x) => ops.multiply(x, 2);
const addTen = (x) => ops.add(x, 10);
const halve = (x) => ops.divide(x, 2);
const subtractThree = (x) => ops.subtract(x, 3);

const transform = pipeline(double, addTen, halve, subtractThree);

const results = [5, 0, -4].map(transform);
console.log(results);
โค3๐Ÿ‘2๐Ÿ”ฅ1
1โค4๐Ÿ”ฅ2๐Ÿ‘1
CHALLENGE

const values = [0.1 + 0.2, NaN, Infinity, -0, 42.6789];

const results = values.map((v, i) => {
if (i === 0) return Number.isInteger(v) + " | " + v.toFixed(2);
if (i === 1) return Number.isFinite(v) + " | " + Number.isNaN(v);
if (i === 2) return Number.isFinite(v) + " | " + Number.MAX_SAFE_INTEGER;
if (i === 3) return Object.is(v, -0) + " | " + (v === 0);
if (i === 4) return v.toFixed(2) + " | " + v.toPrecision(4);
});

results.forEach(r => console.log(r));
โค3๐Ÿ”ฅ2๐Ÿค”2
๐ŸคŸ Node.js 26.0 (Current) Released

It's here! Complete with the Temporal API enabled by default, V8 14.6 (say hello to map โ€˜upsertโ€™ methods like Map.prototype.getOrInsert() and iterator sequencing with Iterator.concat()), plus Undici 8. v26 is the โ€˜Currentโ€™ cutting-edge release until October when it gets promoted to LTS.

Rafael Gonzaga
Please open Telegram to view this post
VIEW IN TELEGRAM
โค4๐Ÿ”ฅ3๐Ÿ‘2๐Ÿคฉ1
CHALLENGE

const items = [
{ name: "banana", price: 1.5, qty: 10 },
{ name: "apple", price: 1.5, qty: 5 },
{ name: "cherry", price: 3.0, qty: 8 },
{ name: "date", price: 2.0, qty: 8 },
];

const sorted = [...items].sort((a, b) => {
if (a.price !== b.price) return a.price - b.price;
if (a.qty !== b.qty) return b.qty - a.qty;
return a.name.localeCompare(b.name);
});

console.log(sorted.map(i => `${i.name}:${i.qty}`).join(", "));
๐Ÿ”ฅ4โค2
๐Ÿ˜ฎ html-to-text 10.0: Advanced HTML to Text Converter

Uses a variety of techniques to convert even complex HTML into plain text (but with some formatting, such as for tables). v10 brings the project up to modern standards.

KillyMXI
Please open Telegram to view this post
VIEW IN TELEGRAM
โค4๐Ÿ‘1