2016-07-14 123 views
0

我調用函數myFunction()並且想要返回source._id,但不幸的是下面的代碼不起作用。 source._id填充並確定,但是我怎樣才能將它完全返回?像這樣:如何從一個lambda函數返回一個字符串?

var newId = myFunction(); 

查詢和保存是貓鼬承諾。

 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

這是功能同步或asynced? –

回答

1

由於您在您的處置有承諾,你應該像承諾使用它們:

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()和source.save()是異步的功能,所以當你返回source.id它實際上是返回到異步函數,而不是你的函數。據我所知,沒有辦法從一個異步函數中返回一個值,並讓它通過你的函數。這裏有兩件事你可以嘗試。

試着返回異步函數,這可能會給你你想要的功能。

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

     **return** 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; 
        **return** source.save((err, doc) => { 
         if (err) { 
          throw (err) 
         } 
         else { 
          return (source._id); 
         } 
        }); 
       } 
      } 
     }) 
    }; 

除此之外,你可以給你的函數一個回調函數,讓你在函數執行後得到值。

 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); 
         } 
        }); 
       } 
      } 
     }) 
    }; 

然後調用它,你會做

myFunction((id) => { //Can access id in here }); 
相關問題