Breeze 执行3个异步操作(其中第二个操作取决于条件)

Breeze 执行3个异步操作(其中第二个操作取决于条件),breeze,durandal,Breeze,Durandal,我正在进行一个durandal/breeze项目 我需要在激活功能中执行几项操作。由于承诺我能够链接异步操作。请注意,我仍然是所有这些东西的初学者,所以请不要犹豫更正我的代码 我的viewModel中有以下激活功能: var activate = function (routeData) { initLookups() var idTran = parseInt(routeData.idTran); var idItin = parseInt(routeData.id

我正在进行一个durandal/breeze项目

我需要在激活功能中执行几项操作。由于
承诺
我能够链接异步操作。请注意,我仍然是所有这些东西的初学者,所以请不要犹豫更正我的代码

我的viewModel中有以下激活功能:

var activate = function (routeData) {

    initLookups()

    var idTran = parseInt(routeData.idTran);
    var idItin = parseInt(routeData.idItin);

    return datacontext.getTransportById(idTran, transport)
            .then(function () { return datacontext.getItineraryById(idItin, itinerary); });
}
所以在return语句中:

  • 由于
    getTransportById

  • 然后,由于
    getInvestureById

  • -

    到目前为止还不错。这段代码按照预期工作并完成其工作(可能未优化)。现在我需要在这两个操作之间插入一个条件,以便创建一个新实体(如果idItin=-1)。在这种情况下,将创建一个新实体。我尝试使用下面的代码,但它不起作用:我的意思是
    promise
    在这里似乎不起作用,因此在不等待异步操作完成的情况下显示视图

    var activate = function (routeData) {
    
        initLookups()
    
        var idTran = parseInt(routeData.idTran);
        var idItin = parseInt(routeData.idItin);
    
        return datacontext.getTransportById(idTran, transport)
                .then(function () { if (idItin == -1) return datacontext.createItineraryDetailTransport(idTran); })
                .then(function () { return datacontext.getItineraryById(idItin, itinerary); });
    }
    
    下面是datacontext的
    CreateInternationaryDetailTransport
    函数:

    var createItineraryDetailTransport = function (idTransport) {
    
        var initialValues = ({
            transportId: idTransport
        });
    
        var newItinerary = manager.createEntity(entityNames.itinerary, initialValues);
        return manager.addEntity(newItinerary);
    }
    

    那么有人知道如何编写代码吗

    我认为正确的方法是:

    return datacontext.getTransportById(idTran, transport).then(function () {
        return datacontext.getItineraryById(idItin, itinerary).then(function(){
            if (idItin == -1) return datacontext.createItineraryDetailTransport(idTran);
            //You have to return something different tu null,false,undefined... or a promise
            return true; 
        );
    });
    
    此外,如果不需要依次执行此调用,可以使用Q库()并行执行。解决办法可以是:

    if(idItin ==-1){
        //CreateItineraryDetailTransport don't return a promise.
        //You can call that like a normal methond.
        //It is not a asyncronous methond
        datacontext.createItineraryDetailTransport(idTran);
    }
    return Q.all([datacontext.getTransportById(idTran, transport),datacontext.getItineraryById(idItin, itinerary)]);
    
    -----编辑-----

    解决方案在其他两个调用之间进行创建:

       return datacontext.getTransportById(idTran, transport).then(function () {
            if (idItin == -1) return datacontext.createItineraryDetailTransport(idTran).then(function(){
                return datacontext.getItineraryById(idItin, itinerary);
            });
            return datacontext.getItineraryById(idItin, itinerary)
        });
    
       // I am using Q to do this method return a promise
        var createItineraryDetailTransport = function (idTransport) {
    
            var deferred = Q.defer();
    
            var initialValues = ({
                transportId: idTransport
            });
    
            var newItinerary = manager.createEntity(entityNames.itinerary, initialValues);
            manager.addEntity(newItinerary);
    
            deferred.resolve(true);
            return deferred.promise;
        }
    
    您还可以使用Q.fcall:

    return Q.fcall(function(){ datacontext.createItineraryDetailTransport(idTran);};
    
    我想也许,你不需要做CreateCivilineDetailTransport来回报你的承诺。也许这个解决方案也是可能的:

    return datacontext.getTransportById(idTran, transport).then(function () {
        if (idItin == -1) datacontext.createItineraryDetailTransport(idTran);
        return datacontext.getItineraryById(idItin, itinerary);
    });
    

    你确定没有别的事情发生吗?我觉得你的代码很正确。这把小提琴能证明你在做什么吗?谢谢你的建议。一个问题:您如何看待CreateInternationaryDetailTransport不返回承诺?在这个函数中,return语句被设置在manager.addEntity上,我认为这个函数返回了一个承诺。您可以在这里看到:。“addEntity”方法返回添加的实体,而不是承诺。几乎不错。我需要在另外两个调用(而不是最后一个调用)之间调用
    createInventureDetailTransport
    。那么,如何继续让这个函数返回一个承诺呢?嗯,我想到了另一个问题:有时这个函数
    createInvestureDetailTransport
    从未被调用,因为条件(idItin==-1)为false。我尝试
    。然后(函数(){if(idItin==-1)返回datacontext.createInventureDetailTransport(idTran);否则返回;})
    ,但它不起作用。在这种情况下,(idItin==-1)最后一个调用似乎从未执行。谢谢你,你帮了我很多。