【问题标题】:Sails: How to return a value from the find functionSails:如何从 find 函数返回值
【发布时间】:2015-08-21 11:21:23
【问题描述】:

我在 Sails js 中工作。我想返回变量sequence[0].NextValue;。但我不明白。

function AutoGenerate(tablename) 
    {
        Sequence.find({TableName:tablename}).exec(function(err,sequence){
            if(err)
            {
                console.log("err");
                return res.negotiate(err);

            }
            else
            {
                console.log(sequence);
                var intCurrentNo = sequence[0].NextValue;
                var intNextNo = sequence[0].NextValue + sequence[0].IncrementBy;                    
                if (intNextNo < sequence[0].MinimumValue || intNextNo > sequence[0].MaximumValue)
                {
                    console.log("Error While Updating UserId")
                    return res.badRequest('Next value not between the Minimum and Maximum value');

                }
                else
                {
                    sequence[0].NextValue = intNextNo;
                    console.log(intNextNo);
                    sequence[0].save(function(err)
                        {
                            if (err) 
                            {
                                console.log("error while update");
                                return res.negotiate(err);
                            }
                            else    
                            {
                                console.log("Incremented");
                                console.log(sequence[0].NextValue); 
                                return sequence[0].NextValue; 
                            }
                        });


                    }
                }
        });
    }

但是Sequence.find({TableName:tablename}) 函数没有返回任何值。请帮我摆脱这个。

【问题讨论】:

    标签: javascript node.js return sails.js waterline


    【解决方案1】:

    你不能返回一个值,因为它是一个异步方法,你必须用回调来做:

    function AutoGenerate(tablename, callback)
    {
      Sequence.find({TableName : tablename}).exec(function (err, sequence)
      {
    
        if (err)
        {
          console.log("err");
          callback(err);
    
        }
        else
        {
          console.log(sequence);
    
          var intCurrentNo = sequence[0].NextValue;
          var intNextNo    = sequence[0].NextValue + sequence[0].IncrementBy;
    
          if (intNextNo < sequence[0].MinimumValue || intNextNo > sequence[0].MaximumValue)
          {
            console.log("Error While Updating UserId")
            callback(new Error('Next value not between the Minimum and Maximum value'));
    
          }
          else
          {
    
            sequence[0].NextValue = intNextNo;
            console.log(intNextNo);
            sequence[0].save(function (err)
            {
              if (err)
              {
                console.log("error while update");
                callback(err);
              }
              else
              {
                console.log("Incremented");
                console.log(sequence[0].NextValue);
                callback(null, sequence[0].NextValue);
    
              }
            });
    
    
          }
        }
    
    
      });
    }
    

    然后这样称呼它:

    AutoGenerate("myTableName", function(err, nextValue){
        if(err){res.negotiate(err);}
        else {/* DO WHAT YOU WANT */}
    });
    

    【讨论】:

    • 感谢您的努力,我需要将回调值存储在一个变量中。那么我可以像这样调用函数var value = AutoGenerate("myTableName");
    • 不,你不能这样做,因为它是异步的,但你不需要让所有使用“nextValue”的代码都必须在回调中。所以你的变量直接是“nextValue”。为什么异步方法不可能做 var value = toto();你必须使用回调。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 2020-03-09
    • 1970-01-01
    相关资源
    最近更新 更多