Comment puis-je obtenir le ExecuteQueryAsync à se comporter plus de synchronusly?
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 me le procurer.....le POINT ENTIER 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"...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*********
}
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.
OriginalL'auteur jazaddict | 2014-03-14
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
le lien est mort. Thx
Eh bien...ce est à partir de 3 ans, et du Scot de la poste à partir de 4, donc... En tout cas, il y a assez dans ma réponse pour vous aider à démarrer.
OriginalL'auteur TimTheEnchanter
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.
C'est un rappel qu'il est "rappelé" à partir de l'achèvement de la async code. Vous pouvez spécifier une fonction de callback (ou son délégué) qui est utilisé pour "terminer", votre travail. En gros si vous avez le code qui dépend de la réalisation de votre requête asynchrone finir premier, il faut la mettre (ou de lui) le délégué/gestionnaires de rappel.
Merci Erik Noren
OriginalL'auteur Erik Noren