@דוד ל.ט.
אתה צריך לשנות את החשיבה. מה שאתה מעלה זה בכלל לא חסרונות של JS, בנו אותו דוקא לזה.
באמת נראה לי ששאילתות כמו שלך מDB לא כדאי לבצע אסינכרוני, כי אתה לא רוצה תוצאה של כל הקודם זוכה אלא לפי הסדר (המילה מקורית ורק אח"כ וריאציה א' ורק אח"כ וריאציה ב').
כשרוצים לעשות לפי סדר בJS הכי טוב זה להשתמש עם רשימה. משהו כזה:
app.post("/", function (req, res) {
searchFromDb('word', function(result)
{
if(!result)
res.status(404).send('Not found');
else
res.send(result);
});
});
function searchFromDb(word, func) {
var searchVariation = { word, word, word};
var getFromDb = function(index) {
db.get(searchVariation[index], function (err, value) {
if(err)
{
if(index < searchVariation.length)
getFromDb(index++)
else
func();
}
else
{
func(value)
}
}
}
getFromDb(0);
}
באוסף searchVariation שמתי רשימה של אותה מילה אבל הכוונה לעשות וריאציות שונות. הבדיקה עליהם תופעל לפי סדר (רק במקרה כישלון של הראשון תתבצע בדיקה של השני).
אם עצם הכנת הוריאציות עולה ביצועים אתה יכול לוותר על רשימה אבל לעשות פונקציה שמקבלת את המקור ורשימה של מה שנוסה כבר ובודקת אם יש מה לנסות עוד.
במידה ויש לך וריאציות עם אותו עדיפות הכי טוב זה לשלוח אסינכרוני ו"כל הקודם זוכה" ככה אתה מרויח את מעלת הJS.
עוד לא ישנתי משבת.. אז עוד אתעמק בתשובתך
בנתיים מה שעולה לי מיד
- ה-DB המדובר מקבל רק שאילתות אי סינכרוניות.
- בגלל שפונקציה אי סינכרונית בתוך לולאה עלולה לגרום לשגיאות (סבירות גבוהה לפי חבר מאוד מוערך פה) אז השתמשתי במודול שנבנה בשביל זה
https://github.com/caolan/async#each
הקוד נראה בנתיים כך
exports.getNikudEvent = function ( words, ee ) {
var nikudim = [];
if( typeof words == 'string' ) words = words.split();
var cnt = -1
async.each(words, function(word, next){
db.get(word,function (err, value) {
cnt++
if (err) {
console.log('Ooops cnot get nikud for: ', word) ;
}
if (value) value = value.split(',');
nikudim.push(value);
next();
});
}
,
function() {
ee.emit("sendAjax", nikudim);
}
);
};
app.post('/getajax', function( req , res) {
var words = req.body.sendWord;
var indexElm = req.body.indexElm;
db.getNikudEvent(words, ee);
ee.once("sendAjax", function (nikudim) {
var obj = { nikudim: nikudim, indexElm: indexElm };
res.send(obj);
});
});
אין לי מילים להודות לך!!
פורסם במקור בפורום CODE613 ב06/09/2015 14:25 (+03:00)