Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Breeze 将多个查询链接在一起的正确语法是什么?_Breeze_Durandal_Hottowel_Q - Fatal编程技术网

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

Breeze 将多个查询链接在一起的正确语法是什么?,breeze,durandal,hottowel,q,Breeze,Durandal,Hottowel,Q,我使用的是使用Durandal的热毛巾水疗模板。在我的Durandal ViewModels中,我使用Breeze从数据库中获取一些数据 我有一个datacontext类,我将所有breeze查询放入其中,所有查询都遵循如下模式: getAthletes: function (queryCompleted) { var query = breeze.EntityQuery.from("Athletes"); return manager

我使用的是使用Durandal的热毛巾水疗模板。在我的Durandal ViewModels中,我使用Breeze从数据库中获取一些数据

我有一个datacontext类,我将所有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);
}
getAthleteAndEfforts: function (athleteId, athleteQueryCompleted, effortsQueryCompleted) {
    return Q.all([
                datacontext.getAthlete(athleteId, athleteQueryCompleted),
                datacontext.getAthleteEfforts(athleteId, effortsQueryCompleted)]);
}
然而,如果我需要执行两个查询,我会遇到问题,但只在我的应用程序的发布版本中。我已尝试使用以下语法执行此操作:

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


实现这一点的正确语法是什么?

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

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

查看@John Papa的jumpstarter以了解更多示例:

好的,感谢您为我指出了正确的方向来找到这个。我看了约翰·帕帕的跳投例子,他有一个

因此,使用他在那里使用的语法,我能够使其正确工作,如下所示:

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

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

Hmmm。。第二个例子给出了一个语法错误。现在看看这些样品,看看是否能找到类似的东西。很高兴你找到了。当Breeze使用Q时,你必须用Q的方式,但经验法则是一样的。如果您的datacontext是异步的,您需要返回一个承诺。另外,您在问题中提到,没有返回正确的回调,但当我看到您调用回调的方式时,我相信您没有按照预期的方式执行-return manager.executeQuery(athleteQuery)。然后(athleteQueryCompleted)-the.then()方法将在查询返回回调后完成,但您将.then()方法传递给了您的observable(我认为,名称很有趣),而我相信您可能希望调用另一个方法,其中observable由您的结果填充,前提是数据有效。请注意…我已经没有空间了,但是使用.then()调用方法来检查数据将特别有用(例如),如果您想进行数据库调用,请检查结果是否为null,如果结果为null或其他什么,请使用任意实体填充它。athleteQueryCompleted是一个函数,因此它在“then”中工作良好有。:)