Problema de JavaScript la interviu [REZOLVAT]

Poate setTimeout e menit mai degraba sa reprezinte o operatie asincrona, cel mai probabil un API call, eu i-as fi intrebat daca asta e intentia acolo:

d.then(res => {
    log("1 ", res);
    let d1 = new Deferred();
    fetch("https://catfact.ninja/fact").then((resp) => resp.json()).then((json) => d1.resolve(json));
    return d1;
});
d.then(res => { log("2", res); return "b" });
d.then(res => { log("3 ", res); return "c"; });
d.resolve("hello"); 

Super! Asta era ideea. Mersi pentru solutie!

Totusi nu am inteles exact de ce ai pus si resolve() si next().

Pe scurt ar fi doar asa:

class Deferred {
    constructor() {
        this.arrayFn = []
    }
    resolve(msg) {
        let res = msg;
        this.arrayFn.forEach((v, i) => {
            if (res instanceof Deferred) {
                res.then(res => v(res)) // asta era linia care trebuia adaugata 
            } else res = v(res)
        })
    }
    then(fn) {
        this.arrayFn.push(fn)
    }
}

Practic instanta d afiseaza doar 1 hello, apoi functiile ramase arrayFn[1] is arrayFn[2] se leaga de instanta d1 si vor fi apelate de acolo. Interesant :thinking:

Practic instanta d afiseaza doar 1 hello, apoi functiile ramase arrayFn[1] is arrayFn[2] se leaga de instanta d1 si vor fi apelate de acolo. Interesant :thinking:

Defapt doar la tine in solutie se intampla ca prima instanta (d) sa afiseze hello, iar restul sa fie afisate din instanta d1. In solutia mea toate functiile sunt apelate de catre instanta originala (d), iar de d1 doar ma ‘leg’ pentru a sti cand trebuie apelata functia urmatoare. Poti vedea aici: JS Bin - Collaborative JavaScript Debugging

Si solutia pe care ai gasit-o tu e interesanta, insa personal mi se pare mai degraba un hack care poate cauza probleme.

Legat de codul tau as avea cateva observatii care cred eu ca il pot imbunatati:

  • daca folosesti { } la if ar trebui sa folosesti si la else
  • variabilele ar trebui sa aiba nume sugestive, v nu imi sugereaza nimic (fn ar fi mai potrivit dupa parerea mea)
  • in general se evita denumiri de genul arrayFn, mai ales ca multi in ziua de azi folosesti TypeScript si stiu exact tipul de date care se afla in variabila respectiva (sau TypeScript cu jsdoc, sau JS pur cu un editor mai smart)
  • aici e vorba de preferinta, insa as lasa cate o linie goala intre functii si dupa instantierea variabilei res (din functia resolve)

Totusi nu am inteles exact de ce ai pus si resolve() si next()

Pentru ca .resolve() e cel care porneste secventa si .next() doar apeleaza urmatoarea functie din sir. As fi putut sa redenumesc .next() in .resolve() si gata de exemplu, dar personal vad functia .next() ca find privata.

4 Likes

Intrebare destul de tricky :smiley:
Oare putem stii ce companie pune astfel de intrebari?
Aveai un interpreter la mana sau trebuia scris “pe hartie” ?

1 Like

Nu stiu cine a pus intrebarea respectiva, dar as zice ca e o companie care cauta un advanced/senior pe JavaScript / frontend.

class Deferred {
  constructor() {
    this.chainedFunctions = [];
    this.promise = new Promise((resolve) => {
      this.resolver = resolve;
    });
  }
  
  then(func) {
    this.chainedFunctions.push(func);
  }
  
  resolve(value) {
    this.chainedFunctions.reduce((promise, func) => promise.then(func), this.promise);
    
    this.resolver(value);
  }
}

1 Like

E un start-up din Israel, iar interviul tehnic era pe google docs :sweat_smile:

Mda, am mai vazut, gen we are looking for Gooogle level talent, dar desigur fara Google level compensation.

Oricum la interviurile la care am fost eu, munca mereu a fost mult mai usoara ca intrebarile, tot ce faceai luai date dintr-o parte si le mapai in alta parte, folosind librarii existente, insa desiguri oamenii aveau pretenii sa stii dynamic programing, because “we hiring the best only”

Tu ai fost interpretorul de js :troll: :smiley:

Google Docs e lux, am folosit ceva pastebin cu sincronizare la mai multe interviuri și făcea update random. Adică ai șters ceva și a ramas după 5 minute tot acolo…