Wpis z mikrobloga

#javascript #node #nodejs

Mam pytanko - jak radzicie sobie z niekonsekwencją w zewnętrzych bibliotekach Node.js odnośnie operacji asynchronicznych? Bo niektóre biblioteki korzystają z Q, inne zwracają ES6 promise lub kompatybilne, a jeszcze inne korzystają z callbacka function( error , result ). Ja bym potrzebował aby wszystko było na jedno kopyto bo używam async/await z babelem i zastanawiam się jak to zrobić, bo nie chciałbym pisać wrappera do każdej możliwej klasy i funkcji a np. mongoose operuje na zasadzie callbacka function(error,result).

Ktoś, coś?:)
  • 15
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Ginden: O dzięki cumplu, pobawie się i sprawdzę czy to działa z async/await. Powiem szczerze że w zasadzie to nie wiem jak wewnętrznie działa ten async/await, tzn. przy np.

let person = await Person.findOne( { name; 'larvaexotech' } );


nie wiem czy on oczekuje konkretnego ES6 promise czy czegokolwiek co spełnia standardy, tj. ma metody .then() , .catch() itp. Z tego co patrzę na dokumentację bluebirda to jest tam napisane
  • Odpowiedz
@larvaexotech: async i await opierają się na generatorach i yield. Nie wiem na ile rozumiesz działanie generatorów (ogólnie pozwalają w łatwy i synchroniczny sposób pisać iteratory :)) ale async i await to w zasadzie lukier składniowy na wykorzystanie generatorów do pisania asynchronicznego kodu w synchroniczny sposób (bez callbacków).

W poniższym linku znajdziewsz wszystko co potrzebne o async await i dlaczego wcześniej potrzebowalismy generatorów. Jest to jedno z wielu fajnych zastosowań
  • Odpowiedz
ale async i await to w zasadzie lukier składniowy na wykorzystanie

generatorów do pisania asynchronicznego kodu w

synchroniczny sposób (bez callbacków).


@regis3: Hmm obecnie nie ma "prawdziwych" async/await bo nie ma silnika JS implementującego async/await, póki co to tylko specyfikacja,
  • Odpowiedz
@larvaexotech: za pomoca generatorow tworzy sie wlasnie maszynę stanów za pomocą której możemy łatwo tworzyć m.in iteratory :)

var myIterable = {}
myIterable[Symbol.iterator] = function* () {
yield 1;
  • Odpowiedz
@larvaexotech: Tak jak @Ginden wspomniał o Bluebird, a @Marmite o promisifyAll możesz wykonywać wyszukiwanie asynchronicznie jak:

a) W implementacji modelu dodajesz:

var mongoose = require('bluebird').promisifyAll(require('mongoose'));
Nie jestem pewny czy to zadziała, bo nie probowałem,
  • Odpowiedz
a coś w stylu import mongoseBase from 'mongose'; let mongose = bluebird.promisifyAll( mongoseBase ); ???

w zasadzie import (.....) jest niemal równoważne z require, różnica jest tak naprawdę taka że wszyskie linie "import" są wykonywane najpierw a później jest wykonywany kod i o tym trzeba pamiętać.

tzn. ES5:

var
  • Odpowiedz
@Abdizriel: kolego przed chwilą mi normalnie zadziałało:

import fsBase from 'fs';
import blueBird from 'bluebird';

const fs = blueBird.promisifyAll( fsBase );
console.log( fs.readFileAsync ); // output: [Function]
  • Odpowiedz
@larvaexotech: Tak zadziała, ale jeśli chcesz nadpisać zmienną biblioteki to już nie zadziała:

import bluebird from 'bluebird';
import mongoose from 'mongoose';
mongoose = bluebird.promisifyAll(mongoose);
  • Odpowiedz