let setSpeedToUpHandler = function(e)
{
if(e.key === " "){
document.removeEventListener("keydown", setSpeedToUpHandler); // удаляем текущий обработчик с этого типа события
setMovementSpeedToSpeedUp(); // увеличиваем скорость персонажа
};
};
let setMovementSpeedToNormalHandler = function(e)
{
if(e.key === " "){
document.removeEventListener("keyup", setMovementSpeedToNormalHandler); // удаляем текущий обработчик с этого типа события
setMovementSpeedToNormal(); // устанавливаем скорость на нормальное значение
};
};
document.addEventListener("keydown", setSpeedToUpHandler);
document.addEventListener("keyup", setMovementSpeedToNormalHandler);
flex
по этому это не так работает как ты думал, а именно - text
питается занять всю ширину. У тебя несколько выходов:width
а как min-width
.text
flex 1
. getUserDataFromDatabase
вполне может возвращать array|false
, а getUserIdFromDatabase
- int|false, хотя я бы с ней не заморочивался, первой вполне достаточно. А userIsPresentInDb
вообще не нужна, вместо неё можно использовать одну их предыдущих. return $result ?: []; // дёшево и сердито
getUserDataFromDatabase
, возвращающая какой-то абстрактный массив - это нонсенс, бессмыслица. Эта функция должна возвращать юзера. Поэтому в идеале надо придумать способ указать, что функция возвращает не абстрактный, а конкретный массив определенного формата. Тем более, что такой способ как раз есть, ведь типизованный массив - это же объект! И для данного случая даже специальный паттерн есть - ValueObject (хотя в случае с пользователем лучше будет все-таки делать полноценный класс, содержащий не только данные, но и методы, например auth(), который сравнивает хэш пароля с введенным). function getUserFromDb( int $userId ) : UserObject {
return $result ? UserObject::fillFromArray($result) : new UserObject();
};
$user = getUserFromDb();
if (!$user->id) {
// нинашли :'(
}
function getUserFromDb( int $userId ) : ?UserObject {
return $result ? UserObject::fillFromArray($result) : null;
};
if ($user = getUserFromDb()) {
// нашли :)
}
class A {
constructor() {
if (!A.prototype.hasOwnProperty('obj')) {
A.prototype.obj = { 'b': 1, 'c': 2 };
}
}
}
class B extends A {
constructor() {
super();
this.nvmProp = 'zZzz';
}
changeObj() {
this.obj.b = 10;
}
}
class C extends A {
constructor() {
super();
this.nvmProp = 'zZzzZz';
}
changeObj() {
this.obj.c = 20;
}
}
let a = new A();
let b = new B();
let c = new C();
b.changeObj();
c.changeObj();
console.log(b.obj); // {b: 10, c: 20}
<?php
$builder = new Builder();
$query = $builder
->table('test')
->select(['*'])
->where(['field1', 'in', [1,2,3]], ['field2', 'like', '%ab%'])
->limit(10, 20)
->get();
$placeholders = $builder->getPlaceholders();
$result = $pdo->prepare($query)->execute($placeholders);
/* фетч результата */
<?php
namespace Compolomus\Builder;
use RuntimeException;
final class Builder
{
private ?string $table = null;
private array $where = [];
private array $columns = ['*'];
private array $placeholders = [];
private ?string $queryType = null;
public function __construct(?string $table = null)
{
if (!is_null($table)) {
$this->table = $table;
}
}
public function table(string $table): Builder
{
$this->table = $table;
return $this;
}
public function count(): Builder
{
$this->queryType = 'select count(*)';
return $this;
}
public function select(?array $columns = null): Builder
{
if (!is_null($columns)) {
$this->columns = $columns;
}
return $this;
}
public function limit(int $limit, int $offset = 0): Builder
{
/*
тут собираем строку с лимит и куда нибудь сохраняем
*/
return $this;
}
public function where(array $conditions, string $type = 'and'): Builder
{
foreach ($conditions as [$field, $condition, $value]) {
/* тут собираем строку из поля, значения и типа */
/* вместо значения подставляем плейсхолдер ? для подготовленных выражений */
$this->placeholders[] = $value;
}
/* куда то сохраняем собранную строку,
по типу собираем массив с типом обьединения,
тут на самом деле всё сложно,
возможно проще будет создать Where класс и отдать туда обработку
*/
return $this;
}
/**
* @throws RuntimeException
*/
public function get(): string
{
if (is_null($this->queryType)) {
throw new RuntimeException('Undefined query type');
}
$query = strtoupper($this->queryType);
/* тут собираем весь запрос из кусочков */
return $query;
}
public function getPlaceholders(): array
{
$placeholders = $this->placeholders;
$this->placeholders = [];
/* обязательно обнуляем, возможно и весь билдер для следующего запроса */
return $placeholders;
}
}
${provinceAsia.shortfall}
, разве нет? В переменной не определено значение, а вы у неё пытаетесь свойство получить. И это происходит ещё до исполнения beforeEach
, вот до неё и не доходит даже.получается описание блока It(...) срабатывает даже до beforeEach( fn )?Давайте будем пользоваться корректной терминологией. У вас есть две функции:
beforeEach
и it
. Эти функции принимают аргументы. Аргументы вычисляются первыми, потом происходит вызов самих функций.it
. Здесь происходит падение.it
, перед этим каждый раз вызывая колбэк, который вы передали в beforeEach
. Таки образом переменная provinceAsia
имеет значение внутри колбэков it
, но не имеет значения на момент выполнения колбэка функции describe
.