在我的激活功能中一个接一个地执行我的3个调用

时间:2013-04-15 13:25:07

标签: 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.createItineraryDetailTransport(idTran);

    datacontext.getTransportById(idTran, transport);
    datacontext.getItineraryById(idItin, itinerary);
}

正如您在上面的代码中看到的,我有3次调用datacontext:

  • datacontext.createItineraryDetailTransport>> 最终...... if(idItin == -1)
  • datacontext.getTransportById
  • datacontext.getItineraryById

现在的问题是每次调用都不是在执行之前等待前一次调用完成。

我的问题:如何在执行下一个调用之前确保一个调用已完成?请注意,第一次通话是在一个条件下......我正在考虑使用“承诺”,但不知道。

感谢。

2 个答案:

答案 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

什么是transportitinerary?我猜他们是偶然遗漏的变量,将使用这些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在激活视图之前等待,则必须返回承诺。