2016-09-05 3 views
0

Ich verstehe nicht unter Teilq Service in node.js Verwirrung

var q = require("q"), 
BlogPost = require("../models/blogPost"); 

module.exports = { 
    getAllPosts: getAllPosts 
}; 

function getAllPosts() { 
    var deferred = q.defer(); 

    BlogPost 
     .find({}) 
     .sort("-date") 
     .exec(function(error, posts) { 
      if (error) { 
       deferred.reject(error); 
      } else { 
       deferred.resolve(posts); 
      } 
     }); 

    return deferred.promise; 
} 

ich über Code in Controller gefunden, aber es nicht verstehen kann. Warum verwenden wir am Ende return secreted.promise? Wie würde ich die getAllPosts später verwenden? Können wir nicht einfach die Postobjekte zurückgeben?

+0

http://www.html5rocks.com/en/tutorials/es6/promises/ – ceejayoz

+0

@ceejayoz verspricht einen Teil von Javascript? Warum können wir das Postobjekt nicht einfach zurückgeben? –

+0

Ja, Versprechen sind Teil von JavaScript. Sie können das Posts-Objekt wahrscheinlich nicht zurückgeben, weil der Dienst 'BlogPost' asynchron ist. – ceejayoz

Antwort

0

Promise ist die gerechte Darstellung des asynchronen Ergebnisses.

Es hat drei Zustände:

1-> Erfolg

-> Fehler

-> Bis

deferred ist ein nur Objekt der Verheißung und es gibt nach Verarbeiten eines der obigen Zustände.

Wir können javascript Code ohne Versprechen verwenden, aber manchmal müssen wir es geben, um unseren Code execute als asynchronous way zu machen.

Deshalb versprechen wir verwenden

+0

also im Grunde ist Promise nur eine bessere Version des Rückrufs? –

+0

Ja, es bietet die bessere Möglichkeit, mit 'synchroner 'Art in der' asynchronen' Welt zu arbeiten! – abdulbarik

+0

besserer Weg bedeutet was? Ist Callback nicht schon erledigt? –

1

Sie würden eine Funktion verbrauchen, die ein Versprechen, wie so zurückgibt:

var getAllPosts = require('./your-module-name.js').getAllPosts; 

getAllPosts() 
.then(function(posts) { 
    //successfully process the posts 
}) 
.catch(function(err) { 
    //handle the error 
}) 
.finally(function(){ 
    //clean up anything you need to... 
}) 
+0

kann ich mehrere dann verwenden? Ist die Bestellung wichtig? kann ich "fangen" über "dann" setzen? –

+1

Sie können den Fang über dem dann wenn Sie möchten. Sie können catch.then.catch.then so oft wie Sie wollen ... einfach zurückgeben, was Sie von jedem Abschnitt in der Versprechungskette benötigen. – bluetoft

Verwandte Themen