Breeze 在激活函数中依次执行我的3个调用
我与durandal/breeze一起从事一个项目。我的Breeze 在激活函数中依次执行我的3个调用,breeze,durandal,Breeze,Durandal,我与durandal/breeze一起从事一个项目。我的activate功能中有以下代码: var activate = function (routeData) { initLookups(); var idTran = parseInt(routeData.idTran); var idItin = parseInt(routeData.idItin); if (idItin == -1) idItin = datacontext.crea
activate
功能中有以下代码:
var activate = function (routeData) {
initLookups();
var idTran = parseInt(routeData.idTran);
var idItin = parseInt(routeData.idItin);
if (idItin == -1)
idItin = datacontext.createItineraryDetailTransport(idTran);
datacontext.getTransportById(idTran, transport);
datacontext.getItineraryById(idItin, itinerary);
}
正如您在上面的代码中所看到的,我有3个对datacontext的调用:
- datacontext.CreateInternationaryDetailTransport>>最终。。。如果(idItin==-1)
- datacontext.getTransportById
- datacontext.GetInventureById
谢谢。您尝试做的棘手部分是有条件地将三个调用链接在一起 您可以使用
then()
方法简单地将多个调用链接在一起。然而,在您的情况下,当第一个条件不满足时,您需要一个初始承诺来连锁
$.when()
方法是这里的诀窍,因为您可以链接Breeze返回的承诺,也可以链接一个“虚拟”承诺,这就是$.when()给您的。如果传递给$的第一个参数在
不是承诺时返回一个立即解析的承诺
如果我正确理解了您的问题,您应该能够编写如下代码:
var activate = function (routeData) {
initLookups();
var idTran = parseInt(routeData.idTran);
var idItin = parseInt(routeData.idItin);
var idtDeferred = $.when();
if (idItin == -1)
idtDeferred = datacontext.createItineraryDetailTransport(idTran);
idtDeferred
.then(datacontext.getTransportById(idTran, transport))
.then(datacontext.getItineraryById(idItin, itinerary));
}
您的代码示例看起来像datacontext.CreateInventureDetailTransport应该设置idItin变量,但我假设它返回一个类似于典型breeze查询的承诺。我不清楚您示例的某些部分
initLookups
是异步的吗?如果是这样,在执行其他异步步骤之前是否必须等待它完成
当createInventureDetailTransport
返回整数idItin
时,它如何能够异步
createInventureDetailTransport
到底做了什么?我的猜测是,idItin==-1
当您还没有inventureDetailTransport
实体,因此没有调用getInventureById
所需的键时。如果是这样,您必须重新构造createInvestureDetailTransport
的签名
为什么getInventureById
必须等待getTransportById
,而它们似乎没有共同点
什么是交通
和行程
?我猜它们是意外忽略的变量,这些变量将与这些datacontext方法中的异步调用结果一起设置
您的错误处理在哪里?如果其中一个异步调用失败,该怎么办
在有人给你一个真正好的答案之前,这些问题必须被解决
在我看来,约瑟夫·加布里埃尔(Joseph Gabriel)基本上走上了正确的道路,尽管我可能写得有点不同
...
var transport, itinerary;
var promise = (idItin == -1) ?
datacontext.createItineraryDetailTransport(aCallBackThatSets_idItin) :
Q.resolve(); // creates a resolved promise
promise = promise
.then(datacontext.getTransportById(idTran, transport)
.then(datacontext.getItineraryById(idItin, itinerary))
.fail(yourErrorHandler);
return promise; // don't forget to return the promise!
...
交通,行程,;
变量承诺=(idItin==-1)?
datacontext.CreateTinerayDetailTransport(设置_idItin的调用包):
Q.resolve();//创造一个坚定的承诺
允诺
.then(datacontext.getTransportById(idTran,transport)
.then(datacontext.getInvestureById(idItin,行程))
.失败(您的错误处理程序);
回报承诺;//别忘了回报承诺!
约瑟夫·加布里埃尔的建议遗漏了最重要的一步……而你不能让他的建议发挥作用的原因……是它忽略了回报承诺
如果您希望Durandal在激活视图之前等待,则必须返回一个承诺breezeJS是用承诺构建的。您可以链接异步查询。我相信breeze测试文件有一个示例,但github目前在其repo方面存在问题。我按照您的建议尝试,但它不起作用。例如,假设我有一个li当我点击一个项目时,我会执行激活功能(您建议的代码)来显示详细视图。这里的问题是viewmodel每次都使用上一次调用的数据。有什么想法吗?我注意到如果我简单地执行
return datacontext.getInventureById(idItin,Inventure)
数据正常。但是如果我使用您的$.when()..,则显示的数据来自上一个datacontext调用。我感到奇怪。(1)initLookups异步吗?是的,但我不必等待它完成,然后再执行其他异步步骤。(2)CreateInvestureDetailTransport没有返回idItin(这是一个输入参数)它返回一个可观察的(行程)。(3)什么是交通和行程?在显示我的视图之前,我必须填写这些可观察的内容。无论如何,我按照您的建议添加了返回的承诺。谢谢。