nodejs最大的優(yōu)勢也是大家用著最為難以理解的一點(diǎn),就是它的異步功能,它幾乎所有的io操作都是異步的创肥,這也就導(dǎo)致很多人不理解也用不習(xí)慣迎献。
前幾天在項(xiàng)目中遇到這樣一個問題瞎访,就是前端觸發(fā)某個請求,想要查詢數(shù)據(jù)庫并且返回這個值吁恍,但是無論如何都返回不回來扒秸,因?yàn)闆]等到查詢完畢,就過早的將空數(shù)據(jù)返回回來了冀瓦,這個困擾了我許久伴奥,當(dāng)時想到一些替代的方法,都是不治本的方法翼闽,今天打算用promise重新解決這個問題拾徙。
promise的作用是讓原本異步執(zhí)行的代碼變成類似同步執(zhí)行,就是在執(zhí)行完之后感局,會將結(jié)果返回回來尼啡。當(dāng)然,我目前也只對promise只有一個淺顯的理解询微,在之后也會深入學(xué)習(xí)的崖瞭,下面說一下這個問題是怎么解決的。
app.use(controller.get('/aaa', function*() {
this.set('Cache-Control', 'no-cache');
var data = yield service.bbb();
this.body = data;
}));
我們可以使用koa框架中的yield撑毛,promise可以作為它的返回參數(shù)书聚。
exports.bbb = function () {
var promise = new Promise(function (resolve, reject) {
var mysql = require('mysql');
var connection = mysql.createConnection({
host: '127.0.0.1',
user: 'root',
password: 'root',
port: '3306',
database: 'db_biology'
});
connection.connect();
connection.query(
"SELECT * FROM Sheet1",
function selectCb(err, results) {
if (results) {
console.log(results);
//resolve(results);
resolve(results);
}
if (err) {
console.log(err);
}
connection.end();
}
);
});
promise.then(function (value) {
console.log(value);
return value;
// success
}, function (value) {
// failure
});
return promise;
};
只需要利用promise就可以實(shí)現(xiàn)我們以前直接return的結(jié)果了,這樣就優(yōu)雅的將異步代碼變成了同步的了~