1

我正在使用利用 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 方法中返回从这些调用返回的承诺。

使用单个查询效果很好,如下所示:

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

完成此操作的正确语法是什么?

4

2 回答 2

3

好的,感谢RainerAtSpirit指出我找到这个的正确方向。我查看了 John Papa 的 jumpstarter 示例,他有一个datacontext 在 primeData 函数下执行此操作

所以使用他在那里使用的语法,我能够让它像这样正常工作:

getAthleteAndEfforts: function (athleteId, athleteQueryCompleted, effortsQueryCompleted) {
    return Q.all([
                datacontext.getAthlete(athleteId, athleteQueryCompleted),
                datacontext.getAthleteEfforts(athleteId, effortsQueryCompleted)]);
}

我在Q 文档中看到了 Q.all,但不知道如何使用它,但这个示例有所帮助。我对此进行了测试,它可以在调试和发布模式下工作。

于 2013-06-10T19:04:17.877 回答
0

不确定为什么第一个版本完全可以工作,但是当 datacontext 进行异步调用时,您会返回一个承诺。

function activate() {
  return datacontext.getAthlete(loadAthlete);
}

或者

function activate() {
  return datacontext.getAthlete(loadAthlete).then( return datacontext.getOtherData(loadOtherData));
}

查看@John Papa 的启动器以获取更多示例:https ://github.com/johnpapa/PluralsightSpaJumpStartFinal/search?q=activate

于 2013-06-10T18:32:08.160 回答