0

私はデュランダル/そよ風のプロジェクトに取り組んでいます。

activate 関数でいくつかのことを実行する必要があります。おかげで、promises非同期操作を連鎖させることができます。私はまだこれらすべての初心者であるため、コードを修正することをためらわないでください。

ビューモデル内に次のアクティブ化関数があります。

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 ステートメントでは次のようになります。

  1. transport私はオブザーバブルのおかげで満たすgetTransportById

  2. 次にitinerary、オブザーバブルのおかげで埋めますgetItineraryById

-

ここまでは順調ですね。このコードは機能し、期待どおりに機能します (最適化されていない可能性があります)。ここで、新しいエンティティを作成する場合 (idItin==-1 の場合) のために、これら 2 つの操作の間に条件を挿入する必要があります。この場合、新しいエンティティが作成されます。以下のコードを試してみましたが、うまくいきませんでした: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); });
}

以下は、データコンテキストのcreateItineraryDetailTransport機能です。

var createItineraryDetailTransport = function (idTransport) {

    var initialValues = ({
        transportId: idTransport
    });

    var newItinerary = manager.createEntity(entityNames.itinerary, initialValues);
    return manager.addEntity(newItinerary);
}

それで、誰かがこのことをコーディングする方法を知っていますか?

4

1 に答える 1

0

正しい方法は次のとおりだと思います。

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 ライブラリ ( https://github.com/kriskowal/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)]);

- - -編集 - - -

他の 2 つの呼び出しの間で作成を行うソリューション:

   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);};

おそらく、 createItineraryDetailTransport return a promise を実行する必要はないと思います。たぶん、この解決策も可能です:

return datacontext.getTransportById(idTran, transport).then(function () {
    if (idItin == -1) datacontext.createItineraryDetailTransport(idTran);
    return datacontext.getItineraryById(idItin, itinerary);
});
于 2013-04-16T20:38:54.633 に答える