Ongelmana on saada script odottamaan edellisen scriptin valmistumista. Aivan kuin
scriptit ajettaisiin kokonaan eri säikeissä toisistaan riippumattomasti.
scriptit ajettaisiin kokonaan eri säikeissä toisistaan riippumattomasti.
Turvaa tilisi vahvistamalla puhelinnumerosi. Voit silloin palauttaa unohtuneen salasanan tekstiviestillä.
Ketjusta on poistettu 2 sääntöjenvastaista viestiä.
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
Vastaukset 34
Vanhimmat
Annan tässä sivun vieritys funktion koodin, joka olkoon esimerkkinä siitä että tämä suoritus tulisi odottaa ennen kuin sen perään annettaisiin alret-sanoma että tehtävä on suoritettu.
function pageScroll() {
window.scrollBy(0,100);
scrolldelay = setTimeout(pageScroll,speed);
let Stop = document.documentElement.scrollHeight;
let KurPos = window.innerHeight window.scrollY;
if (KurPos == Stop) {
clearTimeout(scrolldelay);
window.scroll(0,0);
}
}
Nyt käy niin että tulee ensin ilmoitus suoritetusta tehtävästä, ja vasta sen kuitattuani alkaa sivun vieritys edistyä. Monen moista olen jo ehtinyt kokeilla saadakseni tapahtumat oikeaan järjestykseen, ei vaan onnistu.
Ajatellaan että tuota vieritys funktiota kutsutaan näin toisesta funktiosta:
function start() {
pageScroll();
alert('Tehtävä, on suoritettu!');
}
Olen käyttänyt tämän testaamiseen, minimaalista selainlaajennosta, joka on vain tätä testiä varten. Tuo start() funktiota kutsutaan näin:
onload=start();
Eli se on kytketty sivun latautumistapahtumaan. Kuinka tämä tulisi hoitaa että asiat tapahtuisi oikeassa järjestyksessä. Ai niin, myös vakio
var speed = 15;
on määritelty javascript tiedoston alkuun, antamaan vieritysnopeuden.
Tein oheisen testin omassa localhostissa ja hyvinhän tuo toimi:
<body onload="pageScroll()">
//your content
<script>
var speed = 15;
function pageScroll(){
window.scrollBy(0,100);
scrolldelay = setTimeout(pageScroll,speed);
let Stop = document.documentElement.scrollHeight;
let KurPos = window.innerHeight window.scrollY;
if (KurPos == Stop){
clearTimeout(scrolldelay);
window.scroll(0,0);
alert("Tehtävä suoritettu");
}
}
</script>
Selain rullaa ensin koko sivun sisällön läpi ja lopuksi näyttää hälyn "Tehtävä suoritettu!".
Joo, noin se kyllä toimii, mutta kun tämä tulee olemaan osa muuta ohjelmaa, jossa tuo;
alert("Tehtävä suoritettu");
korvataan joukolla muita funktioita ja tapahtumia. Eli ei voida yhdistää tuolla tavalla. Täytyisi pystyä säilyttämään tuo kutsurakenne
function start() {
pageScroll();
alert('Tehtävä, on suoritettu!');
}
Siinä tapauksessa jQuery voisi olla avuksi:
<body>
//your content
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
var speed = 15;
function pageScroll(){
window.scrollBy(0,100);
scrolldelay = setTimeout(pageScroll,speed);
let Stop = document.documentElement.scrollHeight;
let KurPos = window.innerHeight window.scrollY;
if (KurPos >= Stop){
clearTimeout(scrolldelay);
window.scroll(0,0);
alert("Tehtävä suoritettu!");
}
}
$(document).ready(function(){
pageScroll();
})
</script>
Tuosta muuntamalla omiin tarpeisiin... ehkä...
Mutta tuossahan on edelleen tuon
alert("Tehtävä suoritettu!");
kutsun suorittajana on se vieritys funktio, eikä sitä saisi kutsua tuolla vieritys funktion sisältä, koska se tullaan korvaamaan vielä tuntemattomalla määrällä muita funktioita ja tapahtumia.
Rakenna joku kikkakolmonen tyyliin "piilotettu div" jonka arvoa muuttamalla triggeroit sen alertin siinä vaiheessa kun se systeemisi tarpeisiin sopii. Minulle ei avaudu kertomuksestasi tarpeesi niin että pystyisin hahmottamaan sitä scripteiksi asti eli täältä tähän.
Promisen palauttavat funktiot on nykyään kätevin niputtaa async/await -parilla. Silloin ne toimivat kuten "perinteiset" synkroniset funktiot.
https://javascript.info/async-await
Kävin katsomassa, vaikuttaa oikealta mutta soveltaminen vaatii tarkempaa perehtymistä, palaan asiaan.
Tunnin kohta sohrannut, ja vain virheitä pukkaa, eikö löytyisi helpompaa keinoa.
On tämä Javascript ihmeellinen ympäristö, kun ei suorita tehtäviä, annetussa järjestyksessä.
Kyllä se suorittaa, mutta suoritukset valmistuvat milloin valmistuvat. Suorituksen päätyttyä kutsutaan callback-funktiota.
Jossain vaiheessa tulee callback-hell. https://blog.hellojs.org/asynchronous-javascript-from-callback-hell-to-async-and-await-9b9ceb63c8e8
Javascriptillä ohjelmointi vaatii hieman erilaista ajattelutapaa.
Mitä, hittoa, https://pastebin.com/ linkkiä ei saa laittaa, vai tuliko liian vähän muuta tekstiä. Eli yritin tuota luultavasti esimerkkiä ohjata tuonne pastebin sivulle jos eivät tänne anna laittaa, mutta poistettiin. Nyt laita tekstiä enemän jotta näkee onko tuokin nyt sitten kielletty, ei toinna lukea tästä eteen päin.
Jopa luovien näkemysten huomiointi näyttelee keskeistä osaa pohdittaessa ongelmanratkaisukyvyn huipentumaa. On hyvin vaikea johdatella asioita siten, että emotionaalinen perikato auttaa käyttäjää ymmärtämään nykysukupolvia henkisesti rasittavaa elämäntyyliä. Eräitä yksityiskohtia lukuunottamatta normaali substanssi pakottaa kohderyhmää huomioimaan huomaamattomia haittatekijöitä.
Todellisuudessa looginen asennoituminen avaa itse kullekin tiedon ja ymmärryksen portin kohti erilaisissa laitoksissa tapahtuvaa valmistusta. Universaalista näkökulmasta katsoen tarveharkintadialogi ennakoi osaltaan vastuuntuntoisten yhteistyökumppaneiden aatteellisia intressejä.
Jos menet edellä kerrotun pb:n saitille ja lisäät osoitteen perään
/y4tcB75Y
niin löydät yhden simppelin esimerkkitoteutuksen missä ajastimella viivästytetään viestin näyttämistä kunnes edellinen skripti on loppuun ajettu.
Ja, kyllähän minä menin.
Sehän toimi, eikä ollenkaan ollut riippuvainen asetetusta ajasta, riitti kunhan se oli olemassa. Tässä on mielenkiintoista se että minä jo testasin saman, mutta puhtaasti HTML ja JavaScript yhdistelmänä. Sinulla tuo oli PHP, HTML ja JavaScript yhdistelmä, jossa tiedostomuotona *.php.
Nyt minun pitää testata tuota korvaamalla tuo PHP JavaScript osuudella, ja katso toimiiko puhtaasti HTML JavaScript yhdistelmänä jossa tiedostomuoto *.html. Palaan asiaan, tuonnempana.
php-palanen on mukana vain siksi että sillä voi helposti säätää testailusivun pituutta ja havaita että se kuittiviesti tulee todellakin vasta lopuksi oli sivulla rivejä 100 vaiko 2000 tai ylikin. Kyseisen osion voi huoletta korvata perus-html -tekstillä ja lopputulos on tasan sama.
No niin, muutin PHP koodin JavaScript koodiksi. Tein myös paremin tilannetta kuvaavat viestidialogien sanomat, että voisit vielä ratkaista tämän jäljelle jääneen ongelman.
https://pastebin.com/K4za064n
ROPOLLE LINKIN VUOKSI
Jopa luovien näkemysten huomiointi näyttelee keskeistä osaa pohdittaessa ongelmanratkaisukyvyn huipentumaa. Täytyy siitä huolimatta että maailmalla on viime aikoina tapahtunut paljon, todeta, että emotionaalinen perikato parantaa viimeaikaisia absurdeja väittämiä.
Me emme tiedä mitä tapahtuu todella, jos yleisesti suositeltava toimintamalli järkeistää käsitystämme kyseisestä asiakokonaisuudesta, mihin tavallaan liittyy myös järjestelmän ulkopuolelle jääneitä epäonnistuneita prosesseja. Jos vertailemme lyhyesti asiaankuuluvia ilmiöitä, huomaamme, että organisaation uusi toimintakaavio asettaa tahomme tukalaan tilanteeseen ajateltaessa hyvinvoivan yhteiskunnan rinnalle muodostuneita epäkohtia.
Täytyy siitä huolimatta että maailmalla on viime aikoina tapahtunut paljon, todeta, että normaali substanssi ennakoi osaltaan peräänkuulutettua lakonisuutta. Vaikka osaltamme onkin saatettu syyllistyä laiminlyönteihin, voidaan taholtamme kuitenkin todeta, että ratifioituja ominaisuuksia omaava vaihtoehto pakottaa kohderyhmää huomioimaan viimeaikaisia absurdeja väittämiä.
Latasin muokatun version aamullisen päälle - samalla pb:n koodilla siis.
Olisiko se taas askeleen lähempänä päämäärää.
No joo, eikö tuohon ole muuta ratkaisua kuin Interval -viivyttäminen jokaiselle suoritettavalle tehtävälle, että ne tapahtuisi ajallisesti oikeassa järjestyksessä. Tuntus että pakkohan siihen olisi olla olemassa jotain muutakin. Pitäisiköhän yrittää JQuery puolelta hakea, kun natiivi JavaScript ei kykene suoritusjärjestystä säilyttämään.
Suoritusjärjestys on ihan oikea. Eri asiat vaan valmistuvat eri aikoina.
Opettele vaan se async/await -tapa. Silloin ohjelmat eivät "jauha" turhaan, ja seuraava funktio aloitetaan vasta edellisen päätyttyä.
Me pyöriteltiin koko ajan setInterval() funktiota joka on tarkoitettu jaksottamaan tehtäviä tietyin väliajoin, esimerkiksi kellon sekuntiviisaria pitäisi siirtää toistuvasti eri asentoon sekunnin välin;
setInterval(MoveClockPointer(), 1000);
Mutta kun haluat asettaa herätyksen tunnin päähän tästä hetkestä, tulisi käyttää;
setTimeout(WakeUp(), 3600000);
Eli näihin ajastamistarpeisiin on ainakin kaksi natiivia funktiota olemassa, mutta eipä taida asiaa auttaa yhtään.
Joo, intervalli kutsuu samaa funktiota yhä uudelleen, kunnes ajastin lopetetaan. Timeout suorittaa funktion puolestaan vain kerran.
Tässä esimerkissä sekuntikello käy seuraavaan tasaminuuttiin, jonka jälkeen ajastin poistetaan.
const odota = () => {
const ajastin = setInterval(() => {
const aika = new Date();
process.stdout.clearLine();
process.stdout.write('\r' aika.toLocaleTimeString());
if(aika.getSeconds() == 0) lopeta();
}, 1000);
const lopeta = () => {
clearInterval(ajastin);
console.log();
}
}
odota();
Tässä vielä tapa miten voi käyttää asyncin ja awaitin kanssa.
const odotaSekunti = () =>
new Promise(funktio => setTimeout(funktio, 1000));
const odotaPariKertaa = async () => {
console.log('Nolla sekuntia mennyt');
await odotaSekunti();
console.log('Sekunti mennyt');
await odotaSekunti();
console.log('Toinen sekunti mennyt');
}
odotaPariKertaa();
Tässä taas Interval-funktio on oikein peruselementissään, nimittäin kun ajat tuon consolissa (Ctrl Shift J), näet kellon ajan selaimen välilehden otsakkeena.
var myVar = setInterval(myTimer, 1000);
function myTimer() {
var d = new Date();
var t = d.toLocaleTimeString();
document.title = t;
}
Tuo pika näppäin yhdistelmä (Ctrl Shift J) saattaa olla vain tämän Chromium selaimen ominaisuuksia, ehkä se on muissa F12 ja sitten valitaan Console -välilehti käsin.
Tuossakin esimerkissäsi odotetaan ajan täyttymistä että päästää tehtävä suorittamaan, mutta tarve olisi odottaa tehtävän päättymistä ja vielä niin että se ei ole kiinni siitä kuinka kauan se vie, ja odottaessa valmistumista, ei ohjelma saisi edetä ollenkaan.
Tässä valossa, ei ole mitään huolta siitä että selainsovellukset valtaisivat työpöytäsovellusten paikan. Paljon pystyy tekemään, mutta erittäin tärkeitä ominaisuuksia puuttuu, ja nähtävästi kyse on tietoturvallisuuden säilyttämisestä kun näitä puutteita ei korjata.
Juu se oli vain "väkisin väännetty" esimerkiksi, kun joku valitteli ettei "pysy järjestyksessä".
Palvelinpuolen javascriptillä asiat tehdään yleensä asynkronisesti, jottei tarvitse jäädä odottelemaan jonkun asian valmistumista. Eli kun homma valmistuu, niin kutsutaan callback-funktiota jne. Mutta nykyään pystyy async/await -yhdistelmällä käyttämään promise-tyylisiä juttuja helpommin.
Tuossa on yksi esimerkki fetchin käytöstä, joka hakee jotain netistä. Kuten näet, niin koodi lyhenee async/awaitilla aika paljon siitä, mitä oli aiemmin pelkkien promisien kanssa.
https://dev.to/shoupn/javascript-fetch-api-and-using-asyncawait-47mp
Niin näkyy tekevän, ei se tuostaan voi enää lyhentyä. github.com esimerkit näyttivät toimivan. Tuohonkin täytyy perehtyä, onko tuosta await ja async yhdistelmästä apua sivun aukaisussa, jossa on aina keksittävä jonkinlainen viivytys siksi aikaa kun sivu kerkiää valmistua kokonaan.
Window.onload taitaa riittää siihen. https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onload
document.onload() ja/tai window.onload() tapahtuma käynnistyy kun jotain verkko-osoitetta tavoitellaan, se ei kerro koska latautuminen on tapahtunut kokonaan.
Väärin. Ks. linkki.
window.onload() tarkoittaa että ruudullinen renderöitävää tavaraa on ladattu ja se voidaan näyttää.
Katsoinhan minä, ja hiukan testailinkin suurilla taustakuvilla, no nyt siinä kävi niin että tuota taidat olla oikeassa. Tässä jossain vaiheessa oli tarkoitus luoda jonkinlainen selain testi, johon sisältyy kahden selaimen yhtäaikainen verkkosivujen läpi käynti. Jossa kumpikin latailee sivuja, odottaa sen valmistumista, sulkee sivun ja hakee seuraavan sivun ja niin edelleen. Kiinnosti kumpi jää toisen jalkoihin, kun pistetään koneellista käskyttämistä mukaan kuvioihin, aikaa mitaten. Se projekti unohtui, mutta silloin kai sain päähäni ettei tuo;
window.onload = (event) => {};
olisi se jonka antamaan aikaan voisi pohjata kokonaisaikaa sivujen latauksista. Muistaakseni selaimien cache eli vielä vaikka window.onload sanoikin sivun valmistuneen. En muista mihinkä se projekti unohtui, ehkä kiinnostuin jostakin muusta enemmän. Vieläkin kalvaa epäilys miten asia on, vaikka noinkin luotettavalta sivulta asia vahvistui.
Viestissä 28.09.2020 07:31 mainittua testiä muokattu Pb:n sivulle vielä kerran.
Yritin async/await -kikoilla säätää loppukuittausta ilman timeoutteja, mutta osoittautui kyllä mahdottomaksi tehtäväksi. Skriptit taustalla valmistuu niin paljon nopeammin kuin testauksessa ollut ruudun/näytön vierityksen päivitys. Oma lopputulema on että alert pitää joka tapauksessa laittaa setInterval -tutkintaan vaikka sitä edeltävät funktiot ajettaisiinkin async/await -määritysten mukaisessa järjestyksessä.
Esimerkissä "promiset" ajetuista funktioista tulee konsoliin ihan niin kuin pitääkin.