在replace()中调用ajax函数

时间:2012-09-03 17:41:48

标签: javascript ajax regex

我有一个包含ajax调用的函数:

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

我叫它:

example("http://www.example.com", function(result) {
    // do something with result
})

但是,我想在这种情况下使用example()

text.replace(/[regex not shown]/g, function(){
    return RegExp.$1 + example(RegExp.$2); // does not work
});

即,正则表达式找到多个匹配项,然后我添加example([whatever it matched])。有没有办法整合

example("http://www.example.com", function(result) {
    // do something with result
})

进入text.replace()

提前谢谢!

4 个答案:

答案 0 :(得分:1)

你做不到。那是因为您将.replace()方法传递给函数文字,因此replace方法将该函数.toString()返回字符串(其源代码)作为参数。

这是因为.replace()方法是同步的,并且不希望回调作为第二个参数,而是一个字符串,所以如果不是,它会将任何第二个参数转换为字符串。

如果您实际调用参数中的函数,导致您的函数没有定义的返回值将解析“undefined”作为第二个值。

但您可以编写自己的异步替换方法并将其添加到String原型中。我无法在手机中编辑代码,所以当我回到计算机上时,如果你还没想到,我就会为你编写代码。

编辑:

其实我错了,你可以在replace方法中使用回调。问题是你在里面使用异步调用的方式。我不知道你究竟想做什么,所以我希望这对你有帮助。

String.prototype.myReplace=function(re, o, p){
    var v=[];
    var t=this;
    t.toString().replace(re, function(m){
        if(m==RegExp.$1){v[1]=m;};
        if(m==RegExp.$2){v[2]=m;};
    });
    $.ajax({
        type: "GET",
        url: v[2],
        contentType: "application/json; charset=utf-8",
        dataType: "jsonp",
        success: function(data) {
            // do something with data

            o[p]=t.toString().replace(re, function(m){
                if(m==RegExp.$1){return v[1];};
                if(m==RegExp.$2){return data.toString();};
            });
        }
    });
};

并称之为:

text.myReplace(/[regex not shown]/g, this/* or whatever object is */, 'text'});

答案 1 :(得分:0)

创建一个函数来进行ajax调用并处理正则表达式上匹配项的替换。根据您在上面提供的内容,这是最模块化的方法,假设您想要多次执行这些类型的替换。

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`
});

请注意,您应该通过在正则表达式实例上调用exec来保持对RegExp本地的使用。这样可以保护代码的线程安全,并防止其他方法获得另一个调用的RegExp。$ N值。

答案 2 :(得分:0)

朋友,我不明白你的问题...你可以在下面的代码中尝试这个...不确定它是否有用......

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};
        }
    });
}

答案 3 :(得分:0)

尝试ConversationJS:

https://github.com/rhyneandrew/Conversation.JS

它允许您以全新的方式进行函数调用,实质上是绑定对事件的调用而不是显式调用。它可以让你以更加“分离”的方式完成你想要做的事情,这意味着它将来也很容易改变和维护!请记住,嵌套依赖永远不会好!