J'ai déjà une couche en JS qui aide les Gets et les Posts au serveur avec les implémentations suivantes :
var getJson = function(url, callback, onError) {
$.get(url)
.done(function(data) {
if(callback != null)
callback(data);
})
.fail (function(error) {
if(onError != null)
onError (error);
else
my.notification.notifyError(onErrorMessage);
});
};
var postJSON = function(url, data, callback, onError) {
$.ajax({
url : url ,
type: "POST" ,
contentType : "application/json"
dataType : "json" ,
date : ko.toJSON(data)
})
.done(function(data) {
if(callback ! = null)
callback(data);
})
.fail(function(error) {
if(onError ! = null)
onError (error);
else
my.notification.notifyError(onErrorMessage);
});
};
Utilisation de ces implémentations sur la couche DataService :
// Get
var find = function(date, onSuccess , onError) {
var url = /* url with the Controller and Action */ + "?queryString = " + data.filter;
getJson(url , onSuccess , onError);
};
// Post
var save = function(date, onSuccess , onError) {
var url = /* url with the Controller and Action */;
postJSON(url, data, onSuccess, onError);
};
Cependant nous utilisons des webapi, qui dans certains cas, une requête dépend du résultat d'une autre requête générant une "Pyramide du Destin". Pour plus d'élégance du code nous implémentons la bibliothèque Q pour la programmation asynchrone.
Pour suivre le modèle montré ci-dessus en utilisant Q promisses a été mis en œuvre une nouvelle méthode de get as show :
var getJsonDefer = function(url, callback, onError) {
return Q.when($.getJSON(url))
.then (function(data) {
if(callback ! = null)
callback(data);
})
.fail (function(error) {
if(onError ! = null)
onError (error);
else
my.notification.notifyError(onErrorMessage);
});
};
J'essaie d'utiliser cette mise en œuvre sur la couche DataService de cette façon :
// Get
var find = function(date, onSuccess , onError) {
var url = /* url with the Controller and Action */ + "?queryString = " + data.filter;
return getJsonDefer(url, onSuccess, onError);
};
Quoi qu'il en soit, dans ma couche viewmodel javascript, je suppose que je dois utiliser 3 recherches et que l'une dépend du résultat de l'autre :
var = dataOne {
filter: " Filter"
};
findOne(dataOne,
function(result) {
return result;
}
function(error) {
throw error;
})
.then(function(args) {
var = datatwo {
filter: args
};
// Second
findTwo(datatwo ,
function(result) {
return result;
}
function(error) {
throw error;
}
);
})
.then(function(args) {
var = dataThree {
filter: args
};
// Third
findThree(dataThree,
function(result) {
return result;
}
function(error) {
throw error;
}
);
}).catch(function(error) {
// Handle any error from all above steps
})
.done();
Mon problème :
J'admets que je ne suis pas en mesure de mettre en œuvre la bonne méthode, parce que toutes mes fonctions à l'intérieur de .then() viennent avec des arguments non définis.
Je me demande quelle est la meilleure pratique pour répondre au scénario proposé ici.