7

我有一个包含 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

4 回答 4

1

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

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

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

但是您可以编写自己的异步替换方法并将其添加到 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'});
于 2012-12-09T18:59:50.283 回答
0

试试 ConversationJS:

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

它允许您以全新的方式进行函数调用,本质上是将调用绑定到事件,而不是进行显式调用。它将允许您以一种更加“解耦”的方式准确地完成您正在尝试做的事情,这意味着它在未来也将很容易更改和维护!请记住,嵌套依赖关系永远不会好!

于 2012-12-09T23:09:31.507 回答
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};
        }
    });
}
于 2012-11-13T12:13:48.047 回答
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 值。

于 2012-09-03T18:42:35.320 回答