Всё правильно получается? stopPropagation не блокирует распространение события, в определении в документации ошибка?
type Reserve = {
(from: Date, to: Date, destination: string): Ticket;
(from: Date, destination: string): Ticket
};
const reserve: Reserve = (from: Date, ...args: [toOrDest: Date, destination: string] | [destination: string]): Ticket => {
const isOne = args.length === 1;
return {
type: isOne ? "one-way" : "two-way",
from,
destination: isOne ? args[0] : args[1],
...(isOne ? {} : {to: args[0]})
};
};
Reserve
. Но тогда при наведении мыши на reserve
будет не совсем понятная подсказка (хотя автокомплит вполне корректный).Здесь можно даже и не заподозрить, что then что-то возвращает.Все функции в js что-то возвращают. Если явного return нет или в нём не указано значение, то возвращается undefined.
Но поскольку там null, можно подумать, что исходный промис просто как-то передается дальше.Так и есть - вы не передали никакой callback и весь этот вызов как бы игнорируется. Этот сценарий аналогичен предыдущему.
Еще интереснее - then возвращает простое значение, которое моментально попадает в следующий then.Это ваш callback возвращает простое значение, которое then оборачивает в отрезолвленный промис.
Можете рассказать в общих чертах, если then возвращает промис, то как он его формирует?Ну берёт и формирует... Примерно так:
then = (onFulfilledCallback, onRejectedCallback) => {
try {
let newValue;
if (this.previousValue instanceof Error) {
newValue = onRejectedCallback(this.previousValue);
} else {
newValue = onFulfilledCallback(this.previousValue);
}
if (newValue instanceof Promise) {
return newValue;
} else {
return Promise.resolve(newValue);
}
} catch (error) {
return Promise.reject(error);
}
}
Это псеводокод но общий смысл такой. bind
кэширует текущее значение своего this
в момент своего вызова, т.е. он привязывает именно функцию, а не объект, в котором находится функция. Иначе нельзя было бы вызывать bind на просто функции по типу foo.bind(abc)
. В мануале, кстати, описано что именно она кэширует - там полный список есть: https://developer.mozilla.org/ru/docs/Web/JavaScri... bind
для понимания механизма:function binder(that) {
let targetFunction = this; // кэш целевой функции
return function() { targetFunction.call(that) } // В возвращаемой функции используем кэш
}
let user = {
name: "Tom",
intro() {
console.log("I am " + this.name);
}
}
user.intro.binder = binder
let f = user.intro.binder(user);
setTimeout(f, 1000);
user.name = "Sid";
user.intro = function() {
console.log("Вообще другая функция. name: " + this.name);
}
Я хочу уточнить - блокируется микросервис (мс) вообще целиком или все-таки только поток, из которого сделан вызов?
Я себе представляю работу так: пусть у нас 2 мс, А и В, сделаны на Spring Web или любом другом веб-фреймворке. Каждого мс по одному экземпляру.
* Пользователь что-то щелкает.
* запрос уходит в А.
* в А создается новый поток (или берется из пула - не важно) для обслуживания пришедшего запроса.
* А вызывает В и ждет от него ответа.
* при этом блокируется не весь А, а только поток, который обслуживает запрос.
Стало быть, если другой пользователь тоже что-то щелкнет, то его запрос тоже будет обслуживаться отдельным потоком, и поэтому сам мс А не блокируется, продолжает нормально работать. Так почему тогда в книге написано, что блокируется микросервис?
блокируется микросервис (мс) вообще целиком или все-таки только поток, из которого сделан вызов?
Так почему тогда в книге написано, что блокируется микросервис?