NodeJS: setTimeout callback rubrika: Programování: JavaScript

5 Nehalem
položil/-a 28.7.2014

Ahoj,

jsem začátečník a potřebuji nadstavit jednu knihovnu pro práci s DB o connection timeout (jelikož ho nemá a pak tam trčí třeba 20 sekund)
Vše je psané v callbacích a nějak nemůžu přijít na to, jak to správně napsat.

Ukázka:

findUser(callback) {
  var timeout = setTimeout(function() {
    return callback(new Error('timeout'));
  }, 2000);
 
  queryDB(function(err, user) {
    clearTimeout(timeout);
    return callback(err, user);
  });
}

Jde o to, že ten vnitřní return v anonymní funkci se nevykoná ve funkci findUser, takže ji neukoční,
tudíž ve výsledku dostanu 2 callbacky: výsledek result (pokud je) a error.

Jak správně prosím obalit volání timeoutem s callbackem ?

Díky

odkaz Vyřešeno
7 maryo
odpověděl/-a 29.7.2014

Return ti tu nepomůže.

findUser(callback) {
    var elapsed = false;
    var timeout = setTimeout(function() {
        elapsed = true;
        callback(new Error('timeout'));
    }, 2000);
 
    queryDB(function(err, user) {
        clearTimeout(timeout);
        if (!elapsed) callback(err, user);
    });
}

Tj. musíš nějak takhle. Asi bych volil spíš promisu než callback. Nicméně standardně promisa nic takovýho nemá, musel bys jí stejně rejectnout tím timeoutem podobnym způsobem, napsat si na to nějakou fci nebo použít nějakou implementaci, která má něco jako třeba Q promise, metodu timeout. Ne každá implementace to má. Nicméně implementací je hromada http://promisesaplus.com/implementations a jde o jednoduchej princip.

https://github.com/kriskowal/q/wiki/API-Reference#promisetimeoutms-message
promise.timeout(10000).then...

Komentáře

  • Nehalem : S Q je mi to jasné :) Nenapsal jsem to do příspěvku, ale ostatním knihovnám jsem se chtěl vyhnout a psát to s co možná nejméně závislostmi. Takto by to asi šlo, jen to trochu "zaprasí" kód, když tam bude více paralelních volání. 29.7.2014
  • maryo : Tak to Q udělá za tebe samozřejmě něco podobnýho. Můžeš si z toho udělat vlastní fci místo závislostí, nicméně promise je zrovna závislost, která se hodí téměř všude. A některý browsery jí umí i nativně bez závislostí. Víc paralelních volání přes Promise.all. Tohle je jen naivní princip. Nepíšu, že to takhle máš všude znova psát :) 29.7.2014

Pro plný přístup na Devel.cz se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.