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

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

Async recursive function помош

  • Ја почнал/а темата
  • #1

Isak Keyten

Practice makes perfect
25 ноември 2014
1,124
1,259
Скопје
Isak Keyten's setup  
Processor & Cooler
Intel® Core™ i5-4460 Processor 6M Cache, 3.20 GHz Haswell 22nm Technology
Motherboard
ASUS H81M-K (SOCKET 1150)
Storage
Samsung SSD 850 PRO 120GB
PSU
Thermaltake TR2 Bronze 700W
RAM
Kingston HyperX DDR3 8GB 1600Mhz Single-channel
Video card
ASUS AMD Radeon R9 280x 3072MB
Mouse
Micfosoft IntelliMouse Optical 1.1 Black
OS
macOS Sierra - 10.12.1
Иам една рекурзивна функција што сакам да ја направам со 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?
 

spiritBreaker

LaravelMaster
27 октомври 2015
2,993
3,364
Зменоо
spiritBreaker's setup  
Processor & Cooler
Intel Core i7 9700K + Cooler Master M240L
Motherboard
Asus ROG STRIX Z390-E Gaming
Storage
Samsung 960 EVO 250GB + Toshiba HDD 2TB + 500 GB Hitachi
PSU
Gigabyte G750H
RAM
2 x 8GB DDR4 Kingston @ 3600MHz
Video card
Gigabyte GTX 1080 Ti G1 Gaming
Case
Asus GT501 TUF
Mouse
Corsair M65 Pro
Keyboard
Cooler Master CK550
Audio
Onboard audio
Monitor
AOC LED 27" I2781FH
OS
Windows 10
  • Ја почнал/а темата
  • #3

Isak Keyten

Practice makes perfect
25 ноември 2014
1,124
1,259
Скопје
Isak Keyten's setup  
Processor & Cooler
Intel® Core™ i5-4460 Processor 6M Cache, 3.20 GHz Haswell 22nm Technology
Motherboard
ASUS H81M-K (SOCKET 1150)
Storage
Samsung SSD 850 PRO 120GB
PSU
Thermaltake TR2 Bronze 700W
RAM
Kingston HyperX DDR3 8GB 1600Mhz Single-channel
Video card
ASUS AMD Radeon R9 280x 3072MB
Mouse
Micfosoft IntelliMouse Optical 1.1 Black
OS
macOS Sierra - 10.12.1
cheeriojs/cheerio

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

gdamjan

On your way to fame
3 април 2008
2,384
685
Скопје
damjan.softver.org.mk
gdamjan's setup  
Processor & Cooler
AMD Ryzen 5 3600 / Wraith Stealth
Motherboard
MSI Mortar Wifi B550m
Storage
nvme 1TB / adata xpg sx8200
PSU
Gigabyte G750H
RAM
G. SKILL Ripjaws V Series 2x 16GB / DDR4 3200Mhz
Video card
Asus RX550 2G
Case
Bequiet! PureBase 500
Keyboard
ThinkPad USB Keyboard With TrackPoint (sk-8855)
OS
Arch Linux
зошто имаш await пред [].concat ? тоа не е async функција

а и,
$a.closest('DL').prev(); и $node.text(); async функции се?
 
Изменето од модератор:
Само 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
 
Последна промена:
  • Ја почнал/а темата
  • #6

Isak Keyten

Practice makes perfect
25 ноември 2014
1,124
1,259
Скопје
Isak Keyten's setup  
Processor & Cooler
Intel® Core™ i5-4460 Processor 6M Cache, 3.20 GHz Haswell 22nm Technology
Motherboard
ASUS H81M-K (SOCKET 1150)
Storage
Samsung SSD 850 PRO 120GB
PSU
Thermaltake TR2 Bronze 700W
RAM
Kingston HyperX DDR3 8GB 1600Mhz Single-channel
Video card
ASUS AMD Radeon R9 280x 3072MB
Mouse
Micfosoft IntelliMouse Optical 1.1 Black
OS
macOS Sierra - 10.12.1
зошто имаш await пред [].concat ? тоа не е async функција
не мора да е асинк за да има авеит, сакам по редослед да идат
а и,
$a.closest('DL').prev(); и $node.text(); async функции се?
Само зашто таа функција не резолва промис не значи дека не моеш да и направиш await.
If the value of the expression following the await operator is not a Promise, it's converted to a resolved Promise. (mozila mdn)
иначе не враќаат по дифолт промис, не
Само 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
Епа овде враќаш промис со new promise, нешто што нејкам да го користам зашто нејкам да мешам стилови
или користам синтаксички шугар како асинк/авеит или се можам со промиси и then then then then да чеинам, шо не ми е целта, сакам вака да научам
плус вторава getCategories не ти враќа ништо, let не е глобална варијабла, не можам да ја читам надвор од скоуп

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

се водев ја по овој guidе ама само поише се збунив
Asynchronous Recursion with Callbacks, Promises and Async.
 
Не циљав кон синтаксична точност и погодување на твој стил, само ти посочив еден патерн за правење на оваа работа.

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

Isak Keyten

Practice makes perfect
25 ноември 2014
1,124
1,259
Скопје
Isak Keyten's setup  
Processor & Cooler
Intel® Core™ i5-4460 Processor 6M Cache, 3.20 GHz Haswell 22nm Technology
Motherboard
ASUS H81M-K (SOCKET 1150)
Storage
Samsung SSD 850 PRO 120GB
PSU
Thermaltake TR2 Bronze 700W
RAM
Kingston HyperX DDR3 8GB 1600Mhz Single-channel
Video card
ASUS AMD Radeon R9 280x 3072MB
Mouse
Micfosoft IntelliMouse Optical 1.1 Black
OS
macOS Sierra - 10.12.1
Не циљав кон синтаксична точност и погодување на твој стил, само ти посочив еден патерн за правење на оваа работа.

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

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.
 

gdamjan

On your way to fame
3 април 2008
2,384
685
Скопје
damjan.softver.org.mk
gdamjan's setup  
Processor & Cooler
AMD Ryzen 5 3600 / Wraith Stealth
Motherboard
MSI Mortar Wifi B550m
Storage
nvme 1TB / adata xpg sx8200
PSU
Gigabyte G750H
RAM
G. SKILL Ripjaws V Series 2x 16GB / DDR4 3200Mhz
Video card
Asus RX550 2G
Case
Bequiet! PureBase 500
Keyboard
ThinkPad USB Keyboard With TrackPoint (sk-8855)
OS
Arch Linux

spiritBreaker

LaravelMaster
27 октомври 2015
2,993
3,364
Зменоо
spiritBreaker's setup  
Processor & Cooler
Intel Core i7 9700K + Cooler Master M240L
Motherboard
Asus ROG STRIX Z390-E Gaming
Storage
Samsung 960 EVO 250GB + Toshiba HDD 2TB + 500 GB Hitachi
PSU
Gigabyte G750H
RAM
2 x 8GB DDR4 Kingston @ 3600MHz
Video card
Gigabyte GTX 1080 Ti G1 Gaming
Case
Asus GT501 TUF
Mouse
Corsair M65 Pro
Keyboard
Cooler Master CK550
Audio
Onboard audio
Monitor
AOC LED 27" I2781FH
OS
Windows 10
  • Ја почнал/а темата
  • #11

Isak Keyten

Practice makes perfect
25 ноември 2014
1,124
1,259
Скопје
Isak Keyten's setup  
Processor & Cooler
Intel® Core™ i5-4460 Processor 6M Cache, 3.20 GHz Haswell 22nm Technology
Motherboard
ASUS H81M-K (SOCKET 1150)
Storage
Samsung SSD 850 PRO 120GB
PSU
Thermaltake TR2 Bronze 700W
RAM
Kingston HyperX DDR3 8GB 1600Mhz Single-channel
Video card
ASUS AMD Radeon R9 280x 3072MB
Mouse
Micfosoft IntelliMouse Optical 1.1 Black
OS
macOS Sierra - 10.12.1

Нови мислења

Последни Теми

Статистика

Теми
42,578
Мислења
821,073
Членови
28,239
Најнов член
Serafimov
На врв Дно