[Angular] ngrx/store state 변화 이해하기... (기초)

Domain/Web 2018.07.11 22:09

 ngrx/store 6.0.1 / Angular 6.x


 ngrx/store 를 처음 써 보는 중에 만나 이슈인데... 어찌보면 당연하긴 하겠지만... 뭔가 magic을 기대하기도 했는데.. 어쨌든...


createSelector(<state>, <action>) 이렇게 될때,  <state> 는 하위의 변화를 detecting하지는 못하는 걸로 보인다. 즉.

state: {
    inner: {
        a: true
    }
}

의 경우

createSelect(state => state.inner, inner => inner.a)

이렇게 해 놓고, dispatch를 통해서, state.inner.a = false 로 하면
selector의 Observer가 fire되지 않는다. 즉, inner.a 는 바뀌었으나, state.inner는 바뀐게 아니라는...


이때 states reference 자체가 reducer에서 바뀌는 경우.. 즉

return state;

가 아니라

return {...state}

가 되면 state의 reference다 바뀌므로 Observer가 fire된다.



Trackback 0 : Comment 0

[Angular] Material - tooltip show 도중 내용 변경시 issue.

Domain/Web 2018.07.11 22:05

Environment: Angular 6.x, Angular Material 6.x


Tooltip애 show 된 이후, Tooltip value에 undefined가 들어가게 되면, 이후 tooltip이 비활성화 되는 것으로 material tooltip component가 처리하는 것으로 보인다.
따라서,
    - html -
    [matTooltip]="myTooltip"

이렇게 한 경우,
tooltip이 'show'된 이후, myTooltip값이
    'a' => 'b' => 'c'
이 순서로 바뀌면, 'c'가 tooltip으로 잘 보이는데,
    'undefined' => 'b'
순서로 replace하면, 'b'가 보이지 않는다. 첫번째 undefined로 인해서, tooltip이 disable되어 버리는 것 같다.

이 경우, mouse를 leave했다가, 다시 enter해서 tooltip이 다시 'show'될 경우, 'b'가 보인다.
즉, 현재 show session에서는 update되지 않고, 다음 'show' session에 보인다.
이것은
    'a' => undefined => 'c'
순서로로 변경할 경우도 마찬가지다 - 당시 show session에서는 'c'가 보이지 않는다.



Trackback 0 : Comment 0

[Typescript] Simple code snippet for MultiProcessing using Pool.

Language/Typescript 2018.06.26 06:30

Very simple code.


Max number of subprocess is number of CPU-cores.


import * as child_process from 'child_process'; import * as os from 'os'; const MAX_POOL = os.cpus().length; export class Task { bin: string; args: string[]; onComplete?: (task: Task, stdout: string, stderr: string) => Promise<void>; onDone?: (task: Task, stdout: string, stderr: string) => Promise<void>; onError?: (task: Task, exitcode: number, stdout: string, stderr: string) => Promise<void>; } export function runInParallel(tasks: Task[]): Promise<number> { let failCnt = 0; let activeCnt = 0; const runNext = function (res: any, rej: any) { const c = tasks.shift(); if (undefined === c) { if (0 >= activeCnt) { res(failCnt); } return; } activeCnt++; child_process.execFile(c.bin, c.args, async (err, stdout, stderr) => { try {

if (err) { failCnt++; if (c.onError) { await c.onError(c, (<any>err)['code'], stdout, stderr); } } else { if (c.onDone) { await c.onDone(c, stdout, stderr); } } if (c.onComplete) { await c.onComplete(c, stdout, stderr); }

} finally {

activeCnt--;

runNext(res, rej);

} }); }; return new Promise((res, rej) => { while (activeCnt < MAX_POOL && tasks.length > 0) { runNext(res, rej); } }); }

Buffered stdout and stderr is used.


Trackback 0 : Comment 0