0

我在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.createItineraryDetailTransport >>最终... if (idItin == -1)
  • datacontext.getTransportById
  • datacontext.getItineraryById

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

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

谢谢。

4

2 回答 2

0

你的例子的某些部分我不清楚。

initLookups异步的吗?如果是这样,您是否必须等待它完成才能执行其他异步步骤?

createItineraryDetailTransport返回整数时如何异步idItin

到底createItineraryDetailTransport是做什么的?我的猜测是,idItin == -1当您还没有ItineraryDetailTransport实体,因此没有您需要调用的密钥时getItineraryById。如果是这样,您必须重组createItineraryDetailTransport.

当他们看似毫无共同之处时,为什么getItineraryById还要等待?getTransportById

transport和是什么itinerary?我猜它们是意外省略的变量,这些变量将在这些数据上下文方法中使用异步调用的结果进行设置。

你的错误处理在哪里?如果其中一个异步调用失败应该怎么办?

这些问题必须先解决,然后才能有人给你一个很好的答案。

Joseph Gabriel 对我来说似乎大部分都在正确的轨道上,尽管我可能写的有点不同

...
var 运输、行程;

var 承诺 = (idItin == -1) ?
      datacontext.createItineraryDetailTransport(aCallBackThatSets_idItin) :
      Q.resolve(); // 创建一个已解决的承诺

承诺=承诺
          .then(datacontext.getTransportById(idTran, 运输)
          .then(datacontext.getItineraryById(idItin, itinerary))
          .fail(yourErrorHandler);

回报承诺;// 不要忘记返回承诺!      

Joseph Gabriel 的建议中缺少的最重要的一步……以及您无法使他的建议发挥作用的原因……是它忽略了兑现承诺。

如果您希望 Durandal 在激活视图之前等待,您必须返回一个承诺

于 2013-04-17T07:25:23.097 回答
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,但我假设它返回一个类似于典型微风查询的承诺。

于 2013-04-15T17:38:51.447 回答