Comment puis-je obtenir le ExecuteQueryAsync à se comporter de manière synchrone?
Aight..cette Sharepoint à l'aide de Javascript..je suis à l'aide d'Alertes pour déboguer mon code Javascript qui s'exécute à partir d'un composant webpart Éditeur de Contenu; le script est dans la bibliothèque d'Actifs .
Je obtenir...le POINT de l'ENSEMBLE de "async" appels de fonction est de ne pas attendre autour pour l'appel à la finition....mais je crains que les actions dans le ExecuteQueryAsync, futures, actions comptent, ne serait pas complète, ce qui entraîne une erreur.
Je suis tout à fait certain que, à cause de mon Alerte EN & Alerter ARRIÈRE de tir "à l'envers" que je suis, en effet, l'obtention de mon comportement Asynchrone. J'ai essayé le "ExecuteQuery" sans le "Async" de la partie...QUI a échoué lamentablement.
Quelqu'un veux gimme a pousser dans la bonne direction vers les activités dans mon ONSUCCESS fonction de finir avant de retourner à l'OBJ fonction?
function One()
{
alert("in ONE");
OBJ();
alert("back from Obj, in One Again");
}
function OBJ(){
alert("in OBJ");
var clientContext = null;
var currentweb = null;
clientContext = new SP.ClientContext.get_current();
web = clientContext.get_web();
var Questionlist = web.get_lists().getByTitle("Exam Objectives");
var camlQuery = new SP.CamlQuery();
var q = ""; //camlQuery text in q to limit colls returned, empty string returns all
camlQuery.set_viewXml(q);
this.listItems = Questionlist.getItems(camlQuery);
clientContext.load(listItems);
clientContext.executeQueryAsync(Function.createDelegate(this, this.onListItemsLoadSuccessObj), Function.createDelegate(this, this.onQueryFailed));
alert("leaving OBJ"); //THIS ALERT FIRES BEFORE THE ALERT BELOW********
}
function onListItemsLoadSuccessObj(sender, args) {
var listItemInfo = '';
var oListItem = null;
var listItemEnumerator = listItems.getEnumerator();
while (listItemEnumerator.moveNext()) {
oListItem = listItemEnumerator.get_current();
listItemInfo += '\nID: ' + oListItem.get_id() +
'\nTitle: ' + oListItem.get_item('Title');
}
alert(listItemInfo.toString()); //THIS ALERT FIRES AFTER THE ALERT ABOVE*********
}
- Vous êtes essentiellement en essayant d'entraver les script de progression à l'aide d'un rappel asynchrone qui n'est pas possible.
- Et ainsi, au lieu que je devrais....?????
- c'est une mauvaise conception de la part de MS, vous devriez avoir l'option des appels synchrones.
Vous devez vous connecter pour publier un commentaire.
Vous voulez regarder dans les Promesses. Scot Hillier, a une excellente écrire ici: http://www.shillier.com/archive/2013/03/04/using-promises-with-the-javascript-client-object-model-in-sharepoint-2013.aspx mais essentiellement, ils vous permettent d'écrire du code comme ceci:
Les fonctions que vous appelez pour faire votre travail (doSomething, doSomethingElseWhenThatsDone, doYetAnotherThingWhenThatsDone) ressemblerait à quelque chose comme ceci:
Chaque met en place un JQuery Différée objet et le renvoie de la Promesse. La Promesse provoque l'appel de la fonction pour s'asseoir et d'attendre jusqu'à ce que la Promesse soit résolu ou rejeté (dans le succès ou l'échec des rappels de ExecuteQueryAsync respectivement).
Vous pouvez faire beaucoup plus avec des promesses, ce effleure à peine la surface. En général, ils vous permettent de vous, si nécessaire, la force d'appels asynchrones être effectuée de façon synchrone.
HTH,
Dave
C'est le comportement attendu. Le
executeQueryAsync
appel est non bloquant. Cela signifie qu'il va arrêter là juste assez longtemps pour obtenir la requête a commencé, avant de poursuivre avec le reste de votre code. Vous pouvez enregistrer un succès et un échec de rappel pour gérer le résultat de la requête.Si vous avez le code que vous voulez exécuter une fois la requête terminée, vous devez la déplacer dans ces rappels.