---
# System prepended metadata

title: Untitled

---

```typescript=


//Написать реализацию функции get которая будет возвращать результат как в примерах

function get(path: string, obj: Record<string, any>, default?: any){
    const slitPath = path.split('.')
    let targetObject = obj
    slitPath.forEach((pathItem) => {
        if (targetObject) targetObject = targetObject[pathItem]
    })
    return targetObject === null ? null : targetObject || default
}

const obj = { store: {field:1, user: { id: 1}}};

//Примеры

get("store.user.id", obj) // выведет 1

get("store.user1.id", obj, 10) // выведет 10, дефолтное значение


//---------------------------------------------------------------------------------------------------------------


// Написать функцию delay

function delay(ms:number){
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve()
        }, ms)
    })
}


async function doIt(){

    await delay(1000);
    
    
    notify.success("All good!");   
}


//---------------------------------------------------------------------------------------------------------------


// Написать хук
// Проблема есть функция getNotifications, которая возвращает список нотификаций, 
// тебе нужно сделать хук, который позволит получать нотификации


async function getNotifications(){
    const {data} = await axios.get("/api/notifications");
    return data;
}


function useNotifications({ms}){
  
    const [loading, setLoading] = useState(false)
    const [error, setError] = useState(null)
    const [items, setItems] = useState(null)
    const [criteria, setCriteria] = useState(false)
    
    useEffect(() => {
        const timeoutId = setTimeout(() => {
            (async function () {
                setCriteria(prev => !prev)
             try {
                setLoading(true)
                const items = await getNotifications()
                setItems(items)
            } catch (e) {
                setError(e)
            }
             })()
        }, ms);
        
        return () => {
            clearTimeout(timeoutId)
        }
    }, [criteria])
    
    useEffect(() => {
        if (items || error) setLoading(false)
    }, [items, error])
    
//     useEffect(()=>{
        
        
//         return Promise
//     }, [...deps]);
    
//     const f = async ()=> {
        
//     }
    
//     f->Promise
    
    return {
        items,
        loading,
        error
    }
}

//используется так

const { items, loading, error } = useNotifications({ms: 5000});

//items - массив нотификаций
//loading - флаг что идет загрузка

//1) Можно ли добавить сюда функцию refresh? для запуска обновления?
//2) Как можно было бы организовать кеширование данных?


//---------------------------------------------------------------------------------------------------------------



// Какие проблемы видишь?


function debounce(fn, ms){
    let timeout = null
    return function() {
        if (timeout) {
            clearTimeout(timeout)
        }
        timeout = setTimeout(() => {
            fn()
        }, ms)
        }
    }
}

function search(){
    
}

const dbSearch = debounce(search, 400);

dbSearch()
await delay(100);
dbSearch()


const Component =(..)=> {
   const [state, setState] = useState();
   const [count, setCount] = useState();
   
    
    const search = async () => {
        
        const [data, count] = await Promise.all([api.search(e.target.value), api.getCount(e.target.value)])
        
        // const data = await api.search(e.target.value); //5с
        // const count = await api.getCount(e.target.value); //5с
        setState(data);
        setCount(count);
    }
    
    const dbSearch = debounce(search, 400);
    
   // const handleSearch = async (e) => {
   //      dbSearch()
   //  };
    
    return <>
            <input type="text" onChange={dbSearch} />
                
            //Render search result
            {state}
            {count}
        </>
    }
}


//---------------------------------------------------------------------------------------------------------------


Задача


Иванов                00:11:22
Петров                01:22:22

.....

Сидоров               02:32:34




// в 2 потока 
// не должен делать больше 2 активных соед. 
// обработка за миним время
// ilshat.gaifullin@etnatrader.com

function proccessUrl(arr:string[]){
    
    
}


 const result = await proccessUrl(["/api/1", "/api/2"...]);



```