25-րդ օր (շաբաթ 5) - նուրբ տարբերությունը հաջորդի () և հաջորդ վերադարձի միջև ()

Նախքան հաջորդը զանգահարելու և հաջորդը վերադառնալու միջև տարբերության հասնելը, կցանկանայի ամփոփել օրը:

Մեր սովորական ուրբաթ Huddle- ը բաղկացած էր որոշ հայտարարություններից, որոշ տեղեկություններ կարիերայի ծառայությունների մասին և առաջ շարժվող ծրագրի մասին և մի քանի նախագծերի ներկայացում, որի վրա մենք աշխատում էինք: Մտածմունքը կայանում է նրանում, որ ներկայացնելով մեր ծածկագիրը ՝ մենք ավելի լավ կխոսենք կոդերի մասին: Կարծում եմ, որ սա շատ լավ բան է անելու, ես միայն կցանկանայի, որ դա ավելի շատ ժամանակ ունենայինք: Իմ առաջարկություններից մեկն այն է, որ մենք Github- ի վերաբերյալ ավելի շատ պաշտոնական կոդային ակնարկներ ունենանք ՝ գործնականում օգտագործելով նույն գործիքները, որոնք մենք ամենայն հավանականությամբ կօգտագործենք աշխատավայրում ՝ այլ մարդկանց ծածկագիրը վերանայելու և մեկնաբանելու համար:

Ես նաև հաճելի մեկ-մեկ հանդիպում ունեցա իմ ռեզյումեների և ծածկագրերի վերաբերյալ նամակների վերաբերյալ այն ընկերությունների համար, որոնց հետաքրքրում եմ դիմել: Բոլորն այնքան կազմակերպված և տեղեկացված են գործընթացն առաջ տանելու գործընթացում: Կարող եմ ասել, որ կա խորը փորձ և գիտելիք այն մասին, թե ինչպես կարելի է աշխատանք գտնել ծրագրաշարի մշակման ոլորտում: Հույս ունեմ, որ ես կարող եմ վերցնել այդ տեղեկատվությունը և օգտագործել այն այս դասընթացի ավարտին աշխատանք գտնելու համար:

Լավ, անցեք հաջորդը () և հաջորդը վերադառնալու միջև եղած տարբերությանը: Դա ես առաջին անգամ նկատեցի մի քանի օր առաջ, երբ ինչ-որ օրինակ ծածկագրով աշխատում էի գիշերային տնային պայմաններում: Մենք օգտագործում ենք Express- ը երթուղիները սահմանելու համար, և ես տեսա, որ նման բան էր:

app.get ('/ post', ֆունկցիա (req, res, հաջորդ) {
  Post.findById (1234) .մեկնարկի (գործառույթ (փոստ, սխալ) {
    եթե (սխալ)
      վերադառնալ հաջորդը (սխալ);
    }
    եթե (! հաղորդագրություն) {
      var notFound = new Error ('Գրառումը չի գտնվել');
      notFound.status = 404;
      վերադառնալ հաջորդը (notFound);
    }
    res.send (post);
  });
});

Այստեղ մենք ուղարկում ենք GET հարցումը ուղու / գրառման վրա: Հետադարձ կապի մեջ երևում է, որ մենք մի տեսակ զանգ ենք անում Post.findById- ին, որը, հավանաբար, տվյալների բազայի հարցում է: Քանի որ սա ենթադրում է տվյալների շտեմարան մուտք գործելը և Խոստումը վերադարձնելը, ինչը պարզ է օգտագործման համար օգտագործման համար, եկեք նայենք այդ գործառույթի ներսում: Մասնավորապես, մենք տեսնում ենք, որ եթե (սխալ) ճիշտ է, կատարվում է հաջորդը (սխալը) վերադարձնելու կոչ: Դրանից հետո մենք ունենք մեկ այլ (եթե գրառումը), որը կրկին կատարում է հետագա վերադարձը (ոչFound), և, վերջապես, եթե մենք որևէ սխալ չենք ստացել, և հաղորդագրությունը դրա մեջ որոշակի տվյալներ ունի, մենք զանգում ենք res.send (post), որը ուղարկում է արդյունքը տվյալների բազայի հարցումը վերադառնում է զննարկիչին:

Այլ օրինակներով ես նման բան կտեսնեի:

app.get ('/ foo',
գործառույթի ստուգումԳրանցում (Req, res, next) {
  եթե (! req.user.registered) {
    // Եթե օգտագործողը չի գրանցվել, անցեք հաջորդ երթուղին:
    // getRegistration- ը չի կատարվի:
    հաջորդ («երթուղի»)
  }
}, ֆունկցիայի getRegistration (req, res, next) {
  Register.find (գործառույթ (սխալ, տվյալներ) {
    եթե (սխալ) հաջորդը վերադառնա (սխալ)
    res.json (տվյալներ)
  });
});

Այս օրինակում մենք պարզապես զանգ ենք անում հաջորդին («երթուղի»): Այսպիսով, բնական հարցն այն է, թե ո՞րն է տարբերությունը վերադարձը օգտագործելու միջև, թե ոչ:

Պարզվում է, ինչպես ես այսօր պարզեցի, որ երթուղու ներսում հաջորդ () հաջորդ զանգը ՉԻ թողնում գործառույթը և անցնում հաջորդ երթուղին: Այս դեպքում երթուղու մնացորդը գնահատվում է, և քանի որ հաջորդը () կանչվել է, հարցումը լուծելու անհրաժեշտություն չկա, և մենք պարզապես կարող ենք անցնել հաջորդ համապատասխան երթուղու կառավարիչ:

Արագ մի կողմ. Հիշեք, որ եթե դուք չեք լուծում հարցումը որևէ երթուղու մեջ, Express- ը ոչինչ չի ուղարկի զննարկիչին և ձեզ կմնան կախված:

Այսպիսով, հաջորդ () ներսից մի երթուղի զանգահարելը պարզապես ասում է, որ Express- ը պետք է անցնի երթուղու մնացորդին, այնուհետև տեղափոխվի հաջորդ համապատասխան երթուղին:

Հակադրեք սա հետ կանչող վերադարձին հաջորդ () երթուղուց ներսից: Կարևոր տարբերությունն այն է, որ երբ դուք զանգում եք վերադարձ (հաջորդ) (), կատարումը անմիջապես թողնում է գործառույթը և անցնում համապատասխանեցման հաջորդ երթուղին: Սա նման է բացառություն նետելու պահվածքին: Մեր երթուղում ինչ-որ բան է պատահել, և մենք ուզում ենք բաց թողնել երթուղում մնացած մնացած ծածկագիրը և պարզապես անցնել համապատասխանության հաջորդ երթուղին:

Իմ այսօր խնդիրն այն էր, որ փորձեմ հարցումն ուղղել MongoDB, որտեղ իմ բոլոր անուններն ու գաղտնաբառերը պահվում են իմ հավելվածի համար: Երբ ես հասա POST հարցմանը, որն ստացավ այն օգտվողի անունը և գաղտնաբառը, որը հաճախորդը նոր էր ներկայացրել, ես պետք է հարցում անեմ, որպեսզի տեսնեմ տվյալների բազայում համապատասխան գրառում կա: Սա ասինխրոն զանգ է `հետադարձ կապի գործառույթով: Ինչ վերաբերում է Express- ին, այն շարունակում է իրականացնել իմ ծածկագիրը, մինչդեռ սպասում է, որ արդյունքը վերադառնա տվյալների շտեմարանից:

Պարզվում է ՝ սա վատ է ինձ համար: Քանի որ Express- ը սպասում է տվյալների շտեմարանից վերադառնալուն, կատարումը շարունակվում է, և ես սկսում եմ տեսնել այս սխալի հաղորդագրությունը:

Սխալ. Ուղարկումը ուղարկելուց հետո հնարավոր չէ վերնագրեր տեղադրել:

Սա Express- ը շարունակվում է այն ժամանակ, երբ ես իսկապես չէի ցանկանում: Ես օգտագործում էի հաջորդը (), երբ ես իսկապես ուզում էի օգտագործել վերադարձը ():

Այսօր դա գիտակցելը հսկայական էր ինձ համար: Լավ է մի քանի օր առաջ բաց հանգույցը լրացնել ՝ զարմանալով, թե որն է տարբերությունը երկու զանգերի մեջ: Ես այժմ կարող եմ վերադառնալ և մաքրել իմ կոդը այս նախագծի համար:

Մեկ վերջին բան `շաբաթական նոր նախագիծը հրապարակվեց այսօր: Մենք պետք է կոդավորենք ինտերնետային կայք, որը թույլ է տալիս խաղալ դահիճի դասական խաղը: Ես կփորձեմ, որ այս հանգստյան օրերին: :-)