【问题标题】:What is the proper syntax to chain multiple queries together?将多个查询链接在一起的正确语法是什么?
【发布时间】:2013-06-11 03:04:17
【问题描述】:

我正在使用利用 Durandal 的 HotTowel SPA 模板。在我的 Durandal ViewModels 中,我使用 Breeze 从数据库中获取一些数据。

我有一个数据上下文类,我将所有轻量查询都放入其中,并且所有查询都遵循如下模式:

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

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

【问题讨论】:

    标签: breeze durandal hottowel q


    【解决方案1】:

    好的,感谢RainerAtSpirit 为我指出正确的方向来找到这个。我查看了 John Papa 的 Jumpstarter 示例,他有一个 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,但不知道如何使用它,但这个示例有所帮助。我对此进行了测试,它可以在调试和发布模式下工作。

    【讨论】:

    • 很高兴你知道了。由于 Breeze 使用 Q,您必须以 Q 方式进行操作,但经验法则是相同的。如果你的数据上下文是异步的,你需要返回一个承诺。
    • 另外,作为您问题中的注释,您提到没有返回正确的回调,但是当我查看您调用它们的方式时,我相信您没有按照您的意愿行事 - 返回经理.executeQuery(athleteQuery).then(athleteQueryCompleted) - .then() 方法将在查询返回回调后完成,但是您将 .then() 方法传递给您的 observable(我假设,名称很有趣)而如果数据有效,我相信您可能想要调用另一种方法,用您的结果填充 observable。只是一个注释...
    • 我的空间用完了,但是使用 .then() 调用方法来检查数据会特别有用(例如)如果您想进行数据库调用,请检查结果是否为不为空,如果它为空或其他东西,则用一些任意实体填充它。
    • 运动员QueryCompleted 是一个函数,因此它在“then”中可以正常工作。 :)
    【解决方案2】:

    不知道为什么第一个版本可以正常工作,但是当 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

    【讨论】:

    • 嗯.. 第二个示例给出了语法错误。现在查看样本,看看我是否能找到类似的东西。
    猜你喜欢
    • 1970-01-01
    • 2015-09-27
    • 2013-07-28
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    相关资源
    最近更新 更多