7
votes

Appelez à Ajax Fonction dans Remplacer ()

J'ai une fonction contenant un appel AJAX: xxx

Je l'appelle par: xxx

, J'aimerais utiliser exemple () dans ce contexte: xxx

c'est-à-dire, la regex trouve plusieurs correspondances, à laquelle j'ajoute ensuite Exemple ([quel que soit ce qu'il correspond]) . Existe-t-il un moyen d'intégrer xxx

dans le texte .replace () ?

merci d'avance!


6 commentaires

Vous devez soit seulement transformer l'exemple en une fonction synchrone (en définissant la synchronisation AJAX FAG, quelque chose avec des implications de mauvaise performance ou de modifier votre logique pour préciser les données avant de remplacer) ou vous devez écrire votre propre chaîne de cordes asynchrone. une fonction.


Que voulez-vous exemple (Regexp. 2 $) pour revenir? Voulez-vous bloquer jusqu'à ce que l'appel AJAX revienne puis renvoyez le résultat de cela ou ...?


@MissingNo: "Préfettez les données avant de remplacer" Fonction asynchrone String-Remplacement "- Pouvez-vous expliquer comment je ferais cela? Merci!


@Ic.: Exemple () renvoie une chaîne, le problème avec l'asynchrone est que exemple (Regexp. 2 $) est indéfini. Je veux attendre que l'appel Ajax soit terminé et renvoie son résultat.


Ce que vous voulez n'est pas possible de cette façon, car .replace doit attendre votre rappel. Cependant, la fonction intégrée .replace n'attend pas. Vous pouvez correspondre une fois pour obtenir les articles à récupérer, les récupérer et enfin le remplacer par les éléments (que vous avez maintenant directement disponible).


Personnellement, je ferais le remplacement des regex du côté serveur pour éviter d'entraîner plusieurs appels AJAX.


4 Réponses :


0
votes

Créez une fonction pour apporter l'appel AJAX et gérer le remplacement des correspondances sur une expression régulière. Sur la base de ce que vous avez fourni ci-dessus, c'est l'approche la plus modulaire en supposant que vous souhaitez effectuer ces types de remplaçants plus d'une fois.

function replaceTextAfterAjax(str, regex, matchSendToServer, fn) {
    var matches = regex.exec(str);
    var externUrl = matches[matchSendToServer];
    $.ajax({
        type: "GET",
        url: externUrl,
        contentType: "application/json; charset=utf-8",
        dataType: "jsonp",
        success: function(json) {
            fn(json.serverSideReplaceText, matches);
        },
    })
}

var text = "go to http://www.example.com";
replaceTextAfterAjax(text, /(go to) (.*)$/, 2, function(response, matches) {
    text = matches[1] + ' ' + response;
    // continue to use `text`
});


3 commentaires

Qu'entendez-vous par continuer à utiliser du texte ? Lorsque j'exécute votre code, texte ne change pas.


La valeur du texte change au-dessus de ce commentaire. Le commentaire indique lorsque vous commencerez à utiliser la nouvelle valeur pour votre application.


Oh je vois. Mais je reçois une erreur de syntaxe de http://www.iana.org/domains/example/ , qui est juste bizarre. Voir Jsfiddle .



0
votes

Friend, je ne comprends pas votre question clairement ... Vous pouvez essayer ce code ci-dessous ... Vous n'êtes pas sûr de fonctionner ou non ...

function example(param, callback) {
    $.ajax({
        type: "GET",
        url: param,
        contentType: "application/json; charset=utf-8",
        dataType: "jsonp",
        success: function(data) {
            // do something with data
            if(typeof callback!='undefined'){callback(data)}else{return data};
        }
    });
}


0 commentaires

1
votes

vous ne pouvez pas. C'est parce que vous passez une méthode à la méthode .replace () une fonction littérale de fonction, la méthode de remplacement prendra cette fonction .Tostring () String renvoyée (son code source) sous forme d'argument.

C'est parce que. La méthode est synchrone et ne vous attendez pas à un rappel en tant que second argument, mais une chaîne, il convertira donc tout second argument en chaîne si elle n'est pas.

et si vous appelez réellement la fonction dans le paramètre, Cause Votre fonction n'a pas de valeur de retour définie analysera «indéfini» comme deuxième valeur.

Mais vous pouvez écrire votre propre méthode de remplacement asynchrone et l'ajouter au prototype de chaîne. Je ne peux pas éditer le code dans mon téléphone, alors quand je retourne à mon ordinateur, je l'ai écrit pour vous si vous n'avez pas compris.

EDIT:

En fait j'étais mal, vous pouvez utiliser un rappel dans la méthode de remplacement. Le problème est la façon dont vous utilisez un appel asynchrone à l'intérieur. Je ne sais pas qu'est-ce que tu essaies exactement de faire, alors j'espère que cela vous aidera. xxx

et appelez-le comme ceci: xxx < / pré>


0 commentaires

0
votes

Essayez Conversationjs:

https://github.com/rhyneantrew/conversation.js

Il vous permet de faire des appels de fonction de manière entièrement nouvelle, des appels essentiellement contraignants aux événements plutôt que de faire des appels explicites. Cela vous permettrait de faire exactement ce que vous essayez de faire de manière beaucoup plus «découplée», ce qui signifie qu'il sera également facile de changer et de maintenir à l'avenir! N'oubliez pas que les dépendances imbriquées ne sont jamais bonnes!


0 commentaires