2016-07-14 2 views
0

関数myFunction()を呼び出すと、残念ながら次のコードが返されてsource._idが返されます。 source._idは塗りつぶしですが、どうすれば元に戻すことができますか?次のようなもの:ラムダ関数から文字列を返す方法は?

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戻ったとき。私の知る限りでは、非同期関数から値を返す方法はなく、関数に渡すことはできません。あなたが試すことができる2つのことがあります。

非同期関数を返すようにしてください。これにより、必要な機能が提供される可能性があります。

 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 }); 
関連する問題