我正在使用使用Durandal的HotTowel SPA模板。在我的Durandal ViewModels中,我使用Breeze从数据库中获取一些数据。
我有一个datacontext类,我将所有的微风查询放入其中,查询都遵循以下模式:
getAthletes: function (queryCompleted) {
var query = breeze.EntityQuery.from("Athletes");
return manager
.executeQuery(query)
.then(queryCompleted)
.fail(queryFailed)
}
由于我在视图模型的activate方法中进行异步调用,所以我必须在activate方法中返回从这些调用返回的promise。
使用单个查询的效果如下:
function activate() {
datacontext.getAthlete(loadAthlete);
}
但是,如果我需要执行两个查询,我会遇到问题,但只能在我的应用程序的发行版中。我尝试使用以下语法执行此操作:
function activate() {
datacontext.getAthlete(loadAthlete).then(datacontext.getOtherData(loadOtherData));
}
这在调试模式下可以正常工作,但是当我将它部署到服务器并且我的脚本被捆绑时,我得到一个不太清楚的异常。
t不是函数
我也试过在我的datacontext类中将它们链接在一起,如下所示,但我仍然得到同样的错误。
getAthleteAndEfforts: function (athleteId, athleteQueryCompleted, effortsQueryCompleted) {
var athleteQuery = breeze.EntityQuery.from("Athletes").where("id", "==", athleteId);
var effortsQuery = breeze.EntityQuery.from("BestEfforts").where("athleteId", "==", athleteId);
return manager.executeQuery(athleteQuery).then(athleteQueryCompleted)
.then(manager.executeQuery(effortsQuery).then(effortsQueryCompleted))
.fail(queryFailed);
}
所以我假设我只是不理解Q.defer()足以正确使用它或者还有其他事情发生。
完成此任务的正确语法是什么?
答案 0 :(得分:3)
好的,感谢RainerAtSpirit指出我找到正确的方向。我看了约翰帕帕的快速启动示例,他有一个datacontext that does this under the primeData function。
因此,使用他在那里使用的语法,我能够让它像这样正确地工作:
getAthleteAndEfforts: function (athleteId, athleteQueryCompleted, effortsQueryCompleted) {
return Q.all([
datacontext.getAthlete(athleteId, athleteQueryCompleted),
datacontext.getAthleteEfforts(athleteId, effortsQueryCompleted)]);
}
我在Q documentation看过Q.all但不知道如何使用它,但这个例子有所帮助。我对此进行了测试,它在调试和发布模式下都有效。
答案 1 :(得分:0)
不确定为什么第一个版本正在运行,但是当datacontext进行异步调用时,您将返回一个承诺。
function activate() {
return datacontext.getAthlete(loadAthlete);
}
或
function activate() {
return datacontext.getAthlete(loadAthlete).then( return datacontext.getOtherData(loadOtherData));
}
查看@John Papa的Jumpstarter以获取更多示例:https://github.com/johnpapa/PluralsightSpaJumpStartFinal/search?q=activate