2016-07-14 13 views
0

Ich rufe die Funktion myFunction() auf und bekomme gerne die source._id zurück, leider funktioniert folgender Code nicht. Die source._id ist gefüllt und ok, aber wie kann ich sie komplett zurückgeben? Wie so etwas wie:Wie gebe ich einen String aus einer Lambda-Funktion zurück?

var newId = myFunction(); 

Die Abfrage und die Speicherung sind Mungo verspricht.

 var myFunction =() => { 
      var query = MyModel.findOne({ user: userId, name: name.name }); 

      query.exec((err, doc) => { 
       if (err) { 
        reject (err); 
       } else { 
        if (doc != null) { 
         var msg = "Error Msg here"; 
         reject(new ValidationError(msg)); 
        } else { 
         var source = new MyModel(); 
         source.someUserProp = userId; 
         source.save((err, doc) => { 
          if (err) { 
           throw (err) 
          } 
          else { 
           return (source._id); 
          } 
         }); 
        } 
       } 
      }) 
     }; 
+0

Ist diese Funktion synchronisiert oder asynced? –

Antwort

1

tun würde, da Sie Versprechungen zur Verfügung haben, sollten Sie sie wie Versprechungen verwenden:

var myFunction =() => { 
    var query = MyModel.findOne({ user: userId, name: name.name }); 

    return query.exec().then(doc => { 
     if (doc != null) { 
      var msg = "Error Msg here"; 
      throw new ValidationError(msg); 
     } 

     var source = new MyModel(); 
     source.someUserProp = userId; 

     return source.save().then(() => source._id); 
    }); 
}; 

myFunction() 
    .then(id => console.log(id)) 
    .catch(err => console.error(err)); 
0

query.exec() und source.save() sind asynchrone Funktionen, so dass, wenn Sie es zurück source.id tatsächlich an den Asynchron-Funktionen und nicht auf Ihre Funktion zurückgegeben wird. Meines Wissens gibt es keine Möglichkeit, einen Wert aus einer asynchronen Funktion zurückzugeben und ihn zu Ihrer Funktion durchzulassen. Hier sind zwei Dinge, die Sie ausprobieren können.

Versuchen Sie, die asynchronen Funktionen zurückzugeben, dies kann Ihnen die gewünschte Funktionalität geben.

Abgesehen davon können Sie Ihrer Funktion einen Rückruf geben, mit dem Sie den Wert erhalten, nachdem die Funktion ausgeführt wurde.

 var myFunction = (callback) => { 
     var query = MyModel.findOne({ user: userId, name: name.name }); 

     query.exec((err, doc) => { 
      if (err) { 
       reject (err); 
      } else { 
       if (doc != null) { 
        var msg = "Error Msg here"; 
        reject(new ValidationError(msg)); 
       } else { 
        var source = new MyModel(); 
        source.someUserProp = userId; 
        source.save((err, doc) => { 
         if (err) { 
          throw (err) 
         } 
         else { 
          callback(source._id); 
         } 
        }); 
       } 
      } 
     }) 
    }; 

Dann es nennen Sie

myFunction((id) => { //Can access id in here }); 
Verwandte Themen