2016-06-12 28 views
0

Ich habe versucht, besseren Code auf meinem node.js Server zu schreiben und nach ein paar Blog-Posts zu lesen wie folgt aus:q- Wenn wie "defer.resolve (myData) zurückzukehren; zurück defer.promise;" VS einfach "return myData" in Versprechen Kette

ich bin immer noch nicht sicher, ob ich den „richtige Weg“ meine Daten auf die Versprechen Kette bin zurück.

Ich kann nicht sagen, wenn es wie diese

Fall 1

var promise = function() { 
    var defer = q.defer(); 
    var myData = "hi" 
    defer.resolve(myData); 
    return d.promise; 
}; 

oder wie diese Daten zurückgeben oder überliefern ein Versprechen geeignet ist.

Fall 2

var promise = function() { 
     var myData = "hi" 
     return myData; 
    }; 

ich davon aus bin, ist, dass wenn ich etwas weiß zurückgegeben werden, wo es für das Versprechen Kette nicht möglich ist, dann zu brechen Fall 2 verwenden, aber wenn sie ist Eine Änderung könnte fehlschlagen (dh es werden Daten von einem Netzwerkanruf zurückgegeben, aber der Benutzer ist offline). Verwenden Sie dann case 1, damit beide Fälle behandelt werden können. Ist das richtig oder habe ich ein Missverständnis darüber, wie dieser Fluss/Prozess funktioniert?

+0

Zeigen Sie uns, wie Sie diese "Versprechen" -Funktion aufrufen/verwenden. Der Unterschied sollte dann offensichtlich sein. – Bergi

+0

Eigentlich ist der richtige Weg, um sofort eine Verheißung für einen Wert zu erstellen, 'return Q (" hi ");' – Bergi

Antwort

0
  1. Versprechen für diejenigen, die Callback-Hölle engagieren, was bedeutet, dass Ihre Arbeitsplätze sind Asynchronous und angekettet
  2. für einen einfachen Fall wie $ Schnipsel(). Erfolg (callback1) .fail (callback2) ist Art von Versprechen 3.your Fall nicht Asynchronous ist, könnte es so aussehen:

var promise1 = function() { 
 
    //async get file name 
 
} 
 

 
var promise2 = function(filename) { 
 
    var defer = q.defer(); 
 
    var myData = "hi" 
 

 
    //async 
 
    fs.readFile(filename, 'utf-8', function(err, data) { 
 
     if (err) { 
 
     defer.reject(err); 
 
     } else { 
 
     defer.resolve(myData); 
 
     } 
 
    } 
 
    } 
 
    return d.promise; 
 
}; 
 
var promise3 = function(data) { 
 
    //use data do something 
 
} 
 

 
var onError(err) { 
 
    console.log(err); 
 
} 
 

 
var onDone(result) { 
 
    console.log(result) 
 
} 
 

 
//your logic might look like 
 
promise1.then(promise2).then(promise3).catch(onError).done(onDone);

1

In b In beiden Fällen geben Sie ein Ergebnis zurück, das sofort bekannt oder berechnet ist, während Sie es im ersten Fall in ein Versprechen einschließen. Ob Sie dies tun wollen oder nicht, hängt davon ab, ob es für den Aufrufer Ihrer Funktion transparent sein soll, ob das Ergebnis asynchron berechnet wird oder nicht. Wenn Sie ein Versprechen zurückgeben, können Sie später die Implementierung Ihrer Funktion ändern, um das Ergebnis asynchron zu berechnen oder abzurufen.

Zwei Hinweise:

  1. Sie sind ein Versprechen für den Fall nicht mit 2, so rufen Sie nicht Ihre Funktion promise.
  2. Im ersten Fall können Sie nur return q("hi"); das Literal in ein Versprechen wickeln.