![](/img/trans.png)
[英]Azure Mobile Services - Server Side Scripts - Comparison to zero using ===
[英]Modifying response using server side scripts on Azure Mobile Services
我有一個移動應用程序,我使用Azure移動服務作為后端。 我有一個場景,我需要修改客戶端從數據庫請求的元素。 我需要根據其最佳得分和表中所有其他記錄的最佳得分來計算所請求記錄的等級和百分位數。 我按照這里的例子寫了下面的腳本:
function read(query, user, request) {
request.execute({
success: function(results) {
results.forEach(function(item) {
var totalsql = "SELECT COUNT(*) FROM scoreInfo";
mssql.query(totalsql, {
success: function(totalresults) {
var totalCount = totalresults[0].Column0;
var moresql = "SELECT COUNT(*) FROM scoreInfo WHERE bestscore > ?";
mssql.query(moresql, [item.bestscore], {
success: function(moreresults) {
var moreBestCount = moreresults[0].Column0;
item.bestrank = moreBestCount + 1;
item.bestpercentile = 100 - moreBestCount*100/(totalCount+1);
}
});
}
});
});
request.respond();
}
});
}
但我沒有在客戶端看到預期的結果。 我甚至嘗試在服務器端記錄結果,但我在客戶端看到的內容與記錄的內容不匹配。 我究竟做錯了什么?
這里的問題是mssql.query
函數是異步的。 最后發生的事情是,在forEach
循環中,你正在觸發許多異步mssql請求,並且在此之后(不等待它們完成)你就是callng request.respond();
那時你仍然沒有任何響應(記住node.js是單線程的,所以沒有響應到了)。
您需要做的是延遲調用request.respond()
直到所有對mssql調用的響應都到達為止。 下面的代碼顯示了一種方法。
function read(query, user, request) {
request.execute({
success: function(results) {
var updateResult = function(index) {
if (index >= results.length) {
// all done
request.respond();
} else {
var item = results[index];
var totalsql = "SELECT COUNT(*) FROM scoreInfo";
mssql.query(totalsql, {
success: function(totalresults) {
var totalCount = totalresults[0].Column0;
var moresql = "SELECT COUNT(*) FROM scoreInfo WHERE bestscore > ?";
mssql.query(moresql, [item.bestscore], {
success: function(moreresults) {
var moreBestCount = moreresults[0].Column0;
item.bestrank = moreBestCount + 1;
item.bestpercentile = 100 - moreBestCount*100/(totalCount+1);
updateResult(index + 1); // update next result
}
});
}
});
}
}
updateResult(0);
}
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.