Puis-je utiliser jquery getScript () sans rappel?
J'ai besoin d'utiliser une fonction javascript à partir d'un fichier js externe à l'intérieur d'un autre fichier js. C'est en gros le code que j'ai essayé:
$.getScript('js/myHelperFile.js');
myHelperFunction();
Cela ne marche pas - j'ai une erreur de "myHelperFunction n'est pas défini".
Toutefois, ce code fonctionne:
$.getScript('js/myHelperFile.js', function(){myHelperFunction();});
J'ai spécifiquement voulez être en mesure de faire le premier moyen - charger le fichier en haut de mon fichier, et ensuite utiliser toutes les fonctions dont j'ai besoin à partir de là. Est-ce possible, ou suis-je l'incompréhension comment getScript fonctionne?
source d'informationauteur froadie
Vous devez vous connecter pour publier un commentaire.
Faire "la première" n'est actuellement pas* possible avec
jQuery.getScript
car il ne prend en charge les opérations asynchrones, et donc il revient tout de suite après avoir été appelé.Puisqu'il revient avant que votre script a été téléchargé lorsque le script tente d'invoquer
myHelperFunction()
myHelperFunction
estundefined
et les causes de cette erreur.*Voir la mise à jour au bas de cette réponse pour une prometteuse nouvelle méthode qui permettra éventuellement de vous écrire du code qui fonctionne presque comme votre style désiré.
Vous pourriez le faire à l'aide de
jQuery.ajax
avec leasync
jeu de paramètrefalse
avec un code qui est quelque chose comme ceci:Mais comme le la documentation états:
C'est une très mauvaise chose. Si le serveur qui fournit
myHelperFile.js
est lente à réagir à tout moment (ce qui sera arriver à un certain point) la page ne répond plus jusqu'à ce que la demande de finitions ou timesout.Ce serait une bien meilleure idée pour embrasser le rappel de style qui est largement utilisé tout au long de jQuery.
Vous n'avez pas besoin d'utiliser une fonction anonyme, vous pouvez mettre votre code dans une fonction nommée:
Si vous avez besoin de charger plus d'une dépendance avant d'appeler
myHelperFunction
cela ne marchera pas, sauf si vous mettez en place une sorte de système pour savoir si toutes les dépendances sont téléchargés avant d'exécuter votre code. Vous pouvez ensuite définir le gestionnaire de rappel sur toutes les.getScript
appelle pour vérifier que toutes les dépendances sont chargés avant l'exécution de votre code.Comme vous pouvez le voir, ce type d'approche devient compliqué et difficile à maintenir rapide.
Si vous avez besoin de charger de multiples dépendances, vous feriez probablement mieux à l'aide d'un scriptloader comme yepnope.js de le faire.
Yepnope utilise les rappels comme
.getScript
de sorte que vous ne pouvez pas utiliser la séquence de style vous voulais rester avec. C'est un bon compromis, mais parce que la réalisation de plusieurs synchronejQuery.ajax
à des appels à la ligne juste composé que des méthodes de problèmes.Mise à jour 2013-12-08
La jQuery 1.5 releasefournit un autre pur jQuery façon de faire. Que de 1,5, toutes les requêtes AJAX retour d'un Différée Objet de sorte que vous pourriez faire ceci:
Être une requête asynchrone, il a évidemment besoin d'un rappel. À l'aide de Deferreds cependant a un énorme avantage sur le traditionnel rappel du système, à l'aide de $.lorsque() vous pouvez facilement étendre ce pour le chargement de plusieurs préalable des scripts sans votre propre alambiqué système de suivi:
Cela permettrait de télécharger les deux scripts simultanément et exécuter uniquement la fonction de rappel après que les deux d'entre eux ont été téléchargés, à l'instar de la Yepnope exemple ci-dessus.
Mise à jour 2014-03-30
J'ai lu récemment un article qui m'a fait prendre conscience d'une nouvelle fonction JavaScript qui pourrait à l'avenir permettre à la nature de la procédure-la recherche-encore-async code que vous vouliez l'utiliser! Async Fonctions utilisera le
await
mot-clé pour interrompre l'exécution d'unasync
fonction jusqu'à ce que l'opération asynchrone se termine. La mauvaise nouvelle, c'est qu'il est actuellement prévu pour l'inclusion dans l'ES7, deux ECMAScript versions loin.await
s'appuie sur les fonctions asynchrones vous attendent au retour d'un Promesse. Je ne suis pas sûr de la façon dont le navigateur implémentations de se comporter, si ils auront besoin d'un vrai ES6 Promesse de l'objet ou si d'autres implémentations de promesses, comme celle de jQuery retours d'appels AJAX suffira. Si un ES6 Promesse est tenue, vous aurez besoin d'envelopperjQuery.getScript
avec une fonction qui retourne une Promesse:Ensuite, vous pouvez l'utiliser pour télécharger et
await
avant de poursuivre:Si vous êtes vraiment déterminé à écrire dans ce style, aujourd'hui, vous pouvez utiliser
asyc
etawait
et ensuite utiliser Traceur à transpile votre code dans le code qui sera exécuté dans les navigateurs actuels. L'avantage de ce processus est que vous pouvez également utiliser de nombreux d'autres nouvelles caractéristiques ES6 trop.À l'aide de la
getScript()
fonctionner sur son propre, je ne pense pas que vous le pouvez. Le problème est que le script est en cours de chargement à l'aide d'AJAX (en effet,getScript
est juste un raccourci pour un spécial$.ajax()
fonction), et lorsque le navigateur tente d'exécuter la fonction sur la ligne suivante, peut-être que le serveur n'a pas encore renvoyé le fichier.Si vous ne souhaitez pas utiliser une fonction de rappel, vous devez utiliser le jQuery
$.ajax()
fonction dans sa forme originale (et oublier legetScript()
), et de définir le transfert de synchrone. De cette façon, vous pouvez être sûr que le script doit être chargé avant l'exécution de votre code continue:$.getScript, et vraiment tous HTTP OP liées à des fonctions jQuery non-blocage des appels par défaut. C'est-à-dire que le code n'est pas de se bloquer lors de l'opération se termine. Ce que cela signifie, c'est que votre code ci-dessus va certainement échouer, car il n'y a aucun moyen de $.getScript va charger le script avant de la ligne de la tentative d'exécution de la méthode s'exécute. C'est pourquoi les fonctions de rappel sont acceptés en tant que paramètres.
Cependant, ce que vous essayez de faire est possible. Une fois que le script a été chargé, vous devriez être en mesure d'appeler à partir de n'importe où. Tout ce qui est nécessaire pour éviter la méthode appelée avant que le script ne soit téléchargé est nécessaire de drapeaux.
BenM la suggestion est possible, mais sauf si vous êtes seulement de faire un seul appel à myHelperFunction il ne fonctionne pas comme une solution parce qu'il n'y aura aucune garantie que le script ont téléchargé avant toute autre méthode d'appel myHelperFunction ont été déclenchées.
Votre premier fonctionne très bien si vous êtes en utilisant JSONP, je fais ça souvent.