Breeze 在激活函数中依次执行我的3个调用

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

我与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.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)什么是交通和行程?在显示我的视图之前,我必须填写这些可观察的内容。无论如何,我按照您的建议添加了返回的承诺。谢谢。