将多个查询链接在一起的正确语法是什么?

时间:2013-06-10 17:18:58

标签: breeze durandal hottowel q

我正在使用使用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()足以正确使用它或者还有其他事情发生。

完成此任务的正确语法是什么?

2 个答案:

答案 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