我有一个包含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()
?
提前谢谢!
答案 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
它允许您以全新的方式进行函数调用,实质上是绑定对事件的调用而不是显式调用。它可以让你以更加“分离”的方式完成你想要做的事情,这意味着它将来也很容易改变和维护!请记住,嵌套依赖永远不会好!