1. Здраво и добредојдовте на форумот на IT.mk.

    Доколку сеуште не сте дел од најголемата заедница на ИТ професионалци и ентузијасти во Македонија, можете бесплатно да се - процесот нема да ви одземе повеќе од 2-3 минути, а за полесна регистрација овозможивме и регистрирање со Facebook и Steam.
    Сокриј

Async recursive function помош

Дискусија во форумот 'Останати' започната од Isak Keyten, 2 Јули 2018.

  1. Isak Keyten

    Isak Keyten
    Practice makes perfect

    1,130
    1,272
    25 ноември 2014
    Иам една рекурзивна функција што сакам да ја направам со async/await за да враќа Promise.

    Нејкам да идам со return new Promise врапер пошто се друго ми е со async await напишано и нема поента да мешам код.

    Код:
    function getCategories($a) {
            let $node = $a.closest('DL').prev();
            let title = $node.text();
            if ($node.length > 0 && title.length > 0) {
                    return title = [title].concat(getCategories($node));
            } else {
                    return [];
            }
    };
    $ e од cheerio, алатка за траверсирање низ HTML DOM со синтакса слична на jQuery

    У превод функцијава ова прави.
    зема $a што е <a href> елемент
    сетира $node да е првиот DL елемент нагоре во HTML-от
    title е првиот најден елемент - innerHTML
    ако постои таков
    враќа title кај што на листа од title append-ува нов член на листата
    со тоа што се повикува пак функцијата само овој пат за $node
    се додека не постои таков node кај што се апендува празна листа
    на овој начин се земаат сите претходни DL елементи во листа

    Што пробав:

    Код:
    async function getCategories($a) {
            let $node = await $a.closest('DL').prev();
            let title = await $node.text();
            if ($node.length > 0 && title.length > 0) {
                    return title = await [title].concat(await getCategories($node));
            } else {
                    return [];
            }
    };
    Што можда е малце наивен пристап. Добивам празна листа во случајов.
    Any help?
     
  2. spiritBreaker

    spiritBreaker
    Unstoppable

    2,648
    2,949
    27 oктомври 2015
    Машко
    g4m3R
  3. Isak Keyten

    Isak Keyten
    Practice makes perfect

    1,130
    1,272
    25 ноември 2014
    cheeriojs/cheerio

    Нема нешо такво cheerio. Слични се ама не се исти. Не е во броусер ова, во nodejs е.
     
  4. gdamjan

    gdamjan
    On your way to fame

    2,236
    513
    3 Април 2008
    зошто имаш await пред [].concat ? тоа не е async функција

    а и,
    $a.closest('DL').prev(); и $node.text(); async функции се?
     
    Изменето од модератор: 6 Јули 2018
  5. Sephiroth

    Sephiroth
    Unstoppable

    3,493
    2,485
    14 Мај 2008
    Машко
    Само getCategories ти е декларирана како async функција и во неа мораш да await-аш нешто асихроно, некој promise на пример.

    За да имаш тек на рекурзивната функција како што сакаш, треба да ја повикаш функцијата рекурзивно во колбекот(then, success, whatever) или ако идеш со async/await, одма после await-от во самата async функција.

    Односно:

    Код:
    function sampleFunc(param) {
        return new Promise(resolve => {
           let $node = param.closest('DL').prev();
           let title = $node.text();
           resolve('resolved', $node, title);
      });
    }
    
    async function getCategories(something) {
        let bla = await sampleFunc(something);
        getCategories(whatever);  
    };
    
    getCategories(whatever) //za da ja startas
     
    Последна промена: 5 Јули 2018
  6. Isak Keyten

    Isak Keyten
    Practice makes perfect

    1,130
    1,272
    25 ноември 2014
    не мора да е асинк за да има авеит, сакам по редослед да идат
    Само зашто таа функција не резолва промис не значи дека не моеш да и направиш await.
    If the value of the expression following the await operator is not a Promise, it's converted to a resolved Promise. (mozila mdn)
    иначе не враќаат по дифолт промис, не
    Епа овде враќаш промис со new promise, нешто што нејкам да го користам зашто нејкам да мешам стилови
    или користам синтаксички шугар како асинк/авеит или се можам со промиси и then then then then да чеинам, шо не ми е целта, сакам вака да научам
    плус вторава getCategories не ти враќа ништо, let не е глобална варијабла, не можам да ја читам надвор од скоуп

    али сепак МИСЛАМ дека сфаќам шо сакаш да напраиш со ова шо си ги поделил функцииве ама касно е ќе пробам утре да го стокмам

    се водев ја по овој guidе ама само поише се збунив
    Asynchronous Recursion with Callbacks, Promises and Async.
     
  7. Sephiroth

    Sephiroth
    Unstoppable

    3,493
    2,485
    14 Мај 2008
    Машко
    Не циљав кон синтаксична точност и погодување на твој стил, само ти посочив еден патерн за правење на оваа работа.

    И друго, не си ја барај бељата автоматски да конвертираш синхрони ствари во асинхрони. Сега е една функција, утре ќе бидат 70000 лини код. Оди нека ти текне што сакал писателот да каже. jQuery селектори се синхрони, а ако ти треба да бидат асинхрони заради некоја сложена и захтевна селекција - you're doing it wrong (AKA anti-pattern)
     
  8. Isak Keyten

    Isak Keyten
    Practice makes perfect

    1,130
    1,272
    25 ноември 2014
    Најверојатно така и ке завршам, ке го лупнам целиот синхрон дел во асинхрона функција што ќе резолва кога ќе заврши синхроната и ќе ја користам преку асинхроната за да можам да ја чекам.

    Btw не е jquery селектор, nodejs код е ова и модулот се вика Cheerio и е синтаксички сличен со JQuery. Не е на фронтенд кодов.
    Го користам Cheerio зашто сакам да скрејпам/парсирам застарен хтмл (во случајов NETSCAPE 1.0 bookmark file) а nodejs нема нативно начин за траверсирање низ DOM. Неам друга опција, регекс е самоубиство и преспоро, full blown headless browser е оверкил...

    Во случајов Cheerio не е promise based и морам да изведувам вакви глупости. Така да те сфаќам дека ти мириса кодов ама не е лош ко шо мислиш.

    И за тоа што сметаш дека е антипатерн е веќе патерн сам по себе особено со работи како Util.promisify и цели библиотеки како Bluebird се фокусираат да врапуваат/конвертираат синхрон код во промис резолвинг код кој ќе може да се повикува асинхроно.

    За жал ова е стејтот на nodejs и јаваскрипт во моментов, and we have to make due.
     
    На Sephiroth му/ѝ се допаѓа ова.
  9. gdamjan

    gdamjan
    On your way to fame

    2,236
    513
    3 Април 2008
    у право си, ми промакнало тоа од спецификацијата
     
    На Isak Keyten му/ѝ се допаѓа ова.
  10. spiritBreaker

    spiritBreaker
    Unstoppable

    2,648
    2,949
    27 oктомври 2015
    Машко
    g4m3R
    Уште во линков шо ти го пратив да видиш го имаше ~ решението ама...
     
  11. Isak Keyten

    Isak Keyten
    Practice makes perfect

    1,130
    1,272
    25 ноември 2014
    Бато пак ти кажувам. Не е jQuery oва. Нема $.when
     

Сподели

Вчитување...