2015-12-21 47 views
-1

我想從函數selectpro獲取返回值,但該值始終爲空。如何使用yield來返回函數中的值?

這是函數selectpro:

exports.selectpro = function(){ 
    var sql = "SELECT DISTINCT projectname FROM invoketable"; 
    var projectname; 
    client.query(sql,function(err,result){ 
     if(err) throw err; 
     projectname = result; 

     console.log('select projectname from db'); 
     //console.log(projectname); //undefined 
     //return projectname; 
    }); 
console.log(projectname); //undefined 
return projectname; 
} 

時調用的函數selectpro:

var mysqlinsertp = require('./public/mysqloperate.js'); 

route.get('/readproject',function *(next){ 
    var dataprodect = mysqlinsertp.selectpro(); 
    this.body={status:200,ok:true,data:dataprodect}; 
    console.log(this.body); 
}); 

我得到的回報是不確定的。我嘗試使用'yield',但是當我使用mysqlinsertp.selectpro()。next()來調用函數時,它返回'next()未定義'。

+0

其中你調用var result = xx.selectpro()?? – Subburaj

+0

@Subburaj我調用名爲routes.js的文件中的函數和名爲readdb.js的文件中定義的'exports.selectpro = function(){}' – gdreamlend

+0

這行代碼是什麼:'console.log(projectname);'show您? – AlexD

回答

-1

您的問題是計時結果。

你跑client.query,它執行查詢和完成時,它會去回調函數

function(err,result){ 
    if(err) throw err; 
    projectname = result; 

    console.log('select projectname from db'); 
}); 

等都以線條

console.log(projectname); 
return projectname; 

是否放錯了地方在那裏。

您的選擇是添加回調函數或使用Promise。

回調函數:

exports.selectpro = function(cb){ 
    var sql = "SELECT DISTINCT projectname FROM invoketable"; 
    var projectname; 
    client.query(sql,function(err,result) { 
     if(err) { 
      cb(err, null); 
     } else { 
      projectname = result; 

      console.log('select projectname from db'); 
      cb(null, projectname); 
     } 
    }); 
}; 

然後調用它像這樣:

var result; 
xx.selectpro(function(err, res) { 
    if (err) throw err; 
    else result = res; 
}); 

或使用的承諾:

exports.selectpro = function(){ 
    return new Promise(function(resolve, reject) { 
     var sql = "SELECT DISTINCT projectname FROM invoketable"; 
     var projectname; 
     client.query(sql,function(err,result){ 
      if(err) { 
       reject(err); 
      } else { 
       projectname = result; 

       console.log('select projectname from db'); 
       resolve(projectname); 
      } 
     }); 
    }); 

}; 

,然後使用調用它:

var result; 
xx.selectpro.then(function(res) { 
    result = res; 
}); 
+0

非常感謝你。如果不是這樣的話,可以在這種情況下使用發電機 – gdreamlend

+0

發電機是什麼意思? – AlexD

+0

是啊生成器和收益率 – gdreamlend