我使用 durandal / breeze 开展项目。我的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:
现在的问题是每次调用都不是在执行之前等待前一次调用完成。
我的问题:如何在执行下一个调用之前确保一个调用已完成?请注意,第一次通话是在一个条件下......我正在考虑使用“承诺”,但不知道。
感谢。
答案 0 :(得分:0)
你要做的事情的棘手部分是有条件地链三个一起调用。
您可以使用then()
方法将多个调用链接在一起。但是在您的情况下,您需要在第一个条件未满足时进行链接的初始承诺。
$.when()
方法就是这里的诀窍,因为你可以链接Breeze返回的一个承诺,或者你可以链接一个“虚拟”承诺,这就是$ .when()给你的。如果传递给$.when
的第一个参数不是promise,那么它将返回一个立即解析的promise。
如果我正确理解了您的问题,您应该能够编写如下代码:
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.createItineraryDetailTransport应该设置idItin var,但我假设它返回一个像典型的微风查询的承诺。
答案 1 :(得分:0)
你的例子的某些部分对我来说不清楚。
initLookups
是否异步?如果是这样,在执行其他异步步骤之前是否必须等待它完成?
createItineraryDetailTransport
在返回整数idItin
时如何异步?
createItineraryDetailTransport
实际上做了什么?我的猜测是idItin == -1
当您还没有ItineraryDetailTransport
实体时,因此没有您需要拨打getItineraryById
的密钥。如果是这样,您必须重新构建createItineraryDetailTransport
的签名。
为什么getItineraryById
在看似没有任何共同点时必须等待getTransportById
?
什么是transport
和itinerary
?我猜他们是偶然遗漏的变量,将使用这些datacontext方法中的异步调用结果进行设置。
您的错误处理在哪里?如果其中一个异步调用失败会发生什么?
在有人能给你一个非常好的答案之前,必须先解决这些问题。
约瑟夫·加布里尔在我看来大部分时间都在正确的轨道上,尽管我可能写的有点不同
... 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!
约瑟夫·加布里尔的建议中缺少的最重要的一步......以及你无法让他的建议发挥作用的原因......是它忽略了回报的承诺。
如果您希望Durandal在激活视图之前等待,则必须返回承诺。