2012-09-20 13 views
14

Jak uzyskać wartość tekstu z poniższego przykładu?Q.js - Korzystanie z odroczonego

Q.js ma na przykład przy użyciu odroczony:

var deferred = Q.defer(); 
FS.readFile("foo.txt", "utf-8", function (error, text) { 
    if (error) { 
     deferred.reject(new Error(error)); 
    } else { 
     deferred.resolve(text); 
    } 
}); 
return deferred.promise; 

W tym przypadku, nie jest funkcją węzeł asynchroniczny jest używany. Co chcę zrobić, to uzyskać wartość tekstu z odroczonej.promise, która jest zwracana. Kiedy console.log (deferred.promise) uzyskać to:

{ promiseSend: [Function], valueOf: [Function] } 

Co robię źle (jak ja po prostu kopiować/wklejać przykład stąd: https://github.com/kriskowal/q#using-deferreds) lub, co jeszcze muszę zrobić, aby rzeczywiście uzyskać ten tekst z pliku?

Mam świadomość, że plik node.js ma synchroniczną wersję powyższego połączenia - moim celem jest zrozumienie, jak odroczone działa z tą biblioteką.

Odpowiedz

10

można uzyskać wartość poprzez obietnicy:

function read() { 
    // your snippet here... 
} 

read().then(function (text) { 
    console.log(text); 
}); 

Również obsługi błędów mogą być przekazywane zarówno jako argument 2 do .then() lub z .fail() metoda:

read().fail(function (err) { 
    console.log(err); 
}); 
2
Q = require('q'); 
FS = require('fs'); 

function qread() { 
    var deferred = Q.defer(); 
    FS.readFile("foo.txt", "utf-8", function (error, text) { 
    if (error) { 
    deferred.reject(new Error(error)); 
    } else { 
    deferred.resolve(text); 
    } 
    }); 
    return deferred.promise; 
}; 

var foo = qread(); 

setTimeout(function() { 
    console.log(""+foo); 
},1000); 

To dziwne, że nie widać wyjścia dla console.log(foo). Nie wiem dlaczego.

Sprawdź więcej przykładów tutaj https://github.com/kriskowal/q/wiki/Examples-Gallery

2
deferred.promise.then(function (text) { 
    console.log(text); // Bingo! 
}); 
1
Q = require('q'); 
FS = require('fs'); 

var deferred = Q.defer(); 
FS.readFile("client-02.html", "utf-8", function (error, text) { 
    if (error) { 
    deferred.reject(new Error(error)); 
    } else { 
    deferred.resolve(text); 
    } 
return deferred.promise.done(setTimeout(console.log(text),1000)); 
});