2016-06-11 15 views
0

Ein gemeinsames Thema, das ich weiß, aber ich will nur mein Verständnis auf der Welt der JS und Versprechungen bestätigen.JS - dann und wartet auf ein Versprechen

So habe ich das folgende Code-Segment, das darin scheitert, dass der then Block nicht wirklich auf das oben genannte Segment wartet, um beendet zu werden. Ich bekomme nämlich nicht den endgültigen/korrekten Wert von okCheck.

var okCheck = false; 

User.findOne({publicID: id}, function (err, userInfo) { 
     if (userInfo.checked.indexOf(id) > -1){ 
     okCheck = true; 
     } 
}) 
.then(function() { 
     //do some additional stuff using the boolean okCheck 
} 

So dies zu beheben - von dem, was ich verstehe, ich brauche eine return zu verwenden - dies richtig ist?

Ist das korrekt - nämlich bin ich garantiert, dass ich immer den endgültigen Wert von okCheck haben werde?

Danke.

+0

Die 'findOne'-Funktion sieht komisch aus: Aus Ihrem Code scheint ein Callback-Argument ** und ** ein Versprechen zurückzugeben. Beide Mechanismen dienen ungefähr demselben Zweck. Sie würden erwarten, dass die Funktion Callbacks ** oder ** Versprechungen verwendet. Sind Sie sicher, dass Sie es richtig anrufen? Können Sie überprüfen, ob sowohl Ihr Callback als auch Ihr 'then'-Handler aufgerufen werden (z. B. durch Hinzufügen eines' console.log() '-Aufrufs innerhalb dieser)? –

+0

Das ist in Ordnung - ich habe eine console.log verwendet, um das zu überprüfen. Ich denke, die Antwort unten sieht gut aus - was denkst du> – userMod2

+0

Aus den Antworten ergibt sich, dass diese bestimmte 'findOne' Funktion [Teil von Sails.js] (http://sailsjs.org/documentation) ist/Referenz/Wasserlinie-Orm/Modelle/Find-One). Es wäre viel klarer gewesen, wenn Sie erwähnt hätten, welche Bibliotheken Sie verwenden, damit andere nicht raten müssen, welche Funktionen Ihr Code verwendet. ;-) –

Antwort

-1

Das ist keine Art und Weise, wie es funktioniert, Sie versprechen, um zurückkehren muss „.then()“ zu verwenden.

var okCheck = false; 

User.findOne({publicID: id}).exec() 
.then(function (userInfo) { 
    if (userInfo.checked.indexOf(id) > -1){ 
     okCheck = true; 
    } 
    return okCheck 
}) 
.then(function (okCheck) { 
    //do some additional stuff using the boolean okCheck 
}) 

Hier gibt ".exec()" Versprechen zurück.

+0

Es gibt absolut keinen Grund für die 'neue Promise()', die Sie innerhalb des '.then()' Handlers verwenden. Sie können einfach einen Wert innerhalb eines '.then()' -Handlers zurückgeben, und dieser Wert wird zum aufgelösten Wert des aktuellen Versprechens. – jfriend00

+0

Also den Code verwenden, den ich oben in meiner Frage 'Return okCheck' habe, ist in sich in Ordnung? – userMod2

+0

Unnötiges Versprechen entfernt, sollte jetzt gut funktionieren –

0

Von dem, was ich verstehe, ich brauche eine return zu verwenden - dies richtig ist?

Ja. Aber return einen Wert zu beeinflussen beeinflusst nichts Timing-bezogenes.

Der Punkt ist, dass der Wert return von einem then Callback der Auflösungswert des Versprechens ist, das es zurückgibt, und das Argument des nächsten Rückrufs in der Kette wird.

Sie sollten nicht äußeren Umfang Variablen von asynchronen Rückrufe ändern. Der richtige Ansatz ist es, Maßnahmen aufzuschieben, bis das Versprechen gelöst hat, nicht zu „warten“ mit allem, was für einen variablen Wert angezeigt werden:

// no `var` here! 
User.findOne({publicID: id}).then(function(userInfo) { 
    return userInfo.checked.indexOf(id) > -1; 
// ^^^^^^ return a boolean 
}).then(function(okCheck) { 
//    ^^^^^^^ receive it here as a parameter 
    … // do some additional stuff using it 
}); 
0

Zwei Punkte:

  • okCheck nicht zuverlässig außerhalb der verwendet werden Kontext von User.findOne's Callback oder einem verketteten .thens Callback, daher hat es keinen Vorteil, es als eine äußere Var zu haben, in der Tat ist es eine schlechte Übung, dies zu tun.
  • Sie sollten nicht versuchen, beide einen direkten Rückruf und eine verkettete then() zu verwenden - sie sind Alternativen.

diese Mungo sein Unter der Annahme, und userInfo.checked.indexOf() synchron zu sein, können Sie eine der folgenden schreiben: zu User.findOne()

User.findOne({publicID: id}, function(err, userInfo) { 
    if(err) { 
     console.log(err); 
    } else { 
     if (userInfo.checked.indexOf(id) > -1) { 
      // do additional stuff 
     } else { 
      // do other stuff 
     } 
    } 
}); 

Kette .then() das Versprechen

Pass einen Rückruf zurückgegeben von User.findOne().exec()

User.findOne({publicID: id}}).exec().then(function(userInfo) { 
    if(userInfo.checked.indexOf(id) > -1) { 
     // do additional stuff 
    } else { 
     // do other stuff 
    } 
}, function(err) { 
    console.log(err); 
}); 

Hinweis: Vieles davon gilt immer noch, auch wenn es kein Mongoose ist.

Verwandte Themen