Kuo skiriasi grįžtamojo ryšio funkcija nuo pažadų JS ir kokiu atveju mes turime juos naudoti?


Atsakymas 1:

Atšaukimai yra gana senas įsilaužimas, kuris buvo padarytas, nes tuo metu pažadai nebuvo įgyvendinti. Niekas negalvojo, kad „Java“ iki 2000-ųjų pabaigos taip sprogs. Pažadai yra kelias į būsimą „Javascript“, nes jie dabar yra ES6 standartų dalis. Net prieš pasiūlant šį standartą, kai kurie geri žmonės įgyvendino kai kurias sistemas, tokias kaip „q“, kad pakartotų pažadus. Taigi pagrindiniai rėmai, tokie kaip „Angular 1.x“ ir „React“, pagal nutylėjimą buvo pažadėti. Bet kokiu atveju, jei ketinate dabar parašyti kokį nors kodą „javascript“, visada naudokitės pažadais.

Norėdami atsakyti į jūsų pirminį klausimą, jie abu daro tą patį, bet šiek tiek skirtingai. Tarkime, kad kai kurias užduotis turite atlikti iškart, kai jūsų ajax užklausa bus įvykdyta. Mes niekada nesužinosime, kada jūsų užklausa bus sėkminga / nepavyks dėl tinklo delsos, ir mes negalime naudoti gijų, nes JS yra vienas sriegis. Negalime užblokuoti pagrindinės gijos, nes naršyklė taps nenaudojama vartotojui. todėl, kai skambiname funkcijai, mes užregistruojame atšaukimą / pažadą ir pereiname prie kitų užduočių, o užbaigus užduotį, užduotis, kurią reikia atlikti po to, bus įvykdyta.


Atsakymas 2:

Atšaukimas yra funkcija, iškviečiama atlikus tam tikrą operaciją. Tai neleidžia blokuoti kodo.

Viena iš akivaizdžių skambučių atkūrimo problemų yra tai, kai viena nuo kitos priklauso kelios asinchroninės operacijos. Taigi, turėsite atgalinių grotuvų, įdėtų į skambinimo grąžinimus, įdėtų į skambinimo grąžinimų vidų ir pan.

funkcija isUserExists (id, callback) {
   getDatabase (funkcija (db) {
       getUser (db, 'vartotojai', ID, funkcija (vartotojas) {
           var rasti = (vartotojas)? tiesa: klaidinga;
           atgalinis ryšys (rastas);
       })
    })
}

Kita vertus, pažadai yra objektai, vaizduojantys asinchroninės operacijos rezultatą.

Jie naudoja atšaukimus, kad suteiktų geresnį ir lengvesnį būdą valdyti asinchroninį darbą, išspręstų įterptųjų atšaukimų problemą (naudojant tada ()), o tvarkymo klaidos tampa ne tokios skausmingos (naudojant .error () ir .catch ()).

funkcija isUserExists (id) {
    grąžinti getDatabase (). tada (funkcija (db) {
        return getUser (db, 'vartotojai', id);
    }). tada (funkcija (vartotojas) {
        grįžti (vartotojui)? tiesa: klaidinga;
    }) .gaudyti (funkcija e) {
       // klaidos rankena
    });
}

// Dabar galime gauti vertę, išspręstą pažado objekto
// sugrąžintas naudojant metodą „isUserExists ()“.
isUserExists.then (funkcija (userExists) {
   // atlikite atgalinio iškvietimo () funkciją, pateiktą ankstesniame pavyzdyje.
});

// Pažadas
funkcija getDatabase (duomenys) {
 grąžinti naują pažadą (funkcija (išspręsti, atmesti) {
     // atlikite bet kokią asinchroninę operaciją ir patikrinkite, ar klaida nebuvo grąžinta
     if (klaida) atmesti (klaida);
     else ryžtis (db);
 });
}

Pastaba: tuometinis () metodas grąžina pažadą. Jei prižiūrėtojo metodas grąžina vertę, tada iki () grąžintas pažadas bus išspręstas, o grąžinta vertė bus jo vertė. Ir jei jis grąžina jau išspręstą pažadą, tada pažadėtas pažadas () bus išspręstas nurodant pažado vertę kaip jo vertę.