先看代码:
content = content.replace(/<img [^>]*src=['"]([^'"]+)[^>]*>/gi, function (match, capture) { $.ajax({ data: { imgSrc: capture }, dataType: 'jsonp', success: function (data) { //如何将data值返回给function (match, capture) } }); });
需求是:在ajax的回调函数中将ajax请求的返回值传递给上层函数(也就是replace的回调函数)。
简面言之:function (match, capture) 要返回 success: function (data) 中的 data 值。
哈哈 官方的解释是这样
Cross-domain requests and dataType: "jsonp"
requests do not support synchronous operation.
所以当因为跨域使用了JSONP的时候,即使设置成同步也是不行的。
可以这样接收返回值
content = content.replace(/<img [^>]*src=['"]([^'"]+)[^>]*>/gi, function (match, capture) { $.ajax({ data: { imgSrc: capture }, dataType: 'jsonp', success: function (data) { //如何将data值返回给function (match, capture)
success_function(data); } }); });
function success_function(info)
{
//处理接收到的数据
}
看来只有用这个方法了,我用这个方法实现试试
实现代码:
var imgSrcRegex = /<img [^>]*src=['"]([^'"]+)[^>]*>/gi; var match; while ((match = imgSrcRegex.exec(content)) !== null) { var originImgSrc = match[1]; $.ajax({ data: { imgSrc: originImgSrc }, dataType: 'jsonp', success: function (data) { replaceImgSrc(content, originImgSrc, data); } }); } function replaceImgSrc(content, originImgSrc, newImgSrc) { content = content.replace(originImgSrc, newImgSrc); }
直接return data 不行吗?
不行,得到的是undefined
@dudu: 那就ajax改为同步的,或者你把replace放到ajax success中去
要不可以修改replace函数啊?
为什么要返回回去啊,直接对值进行处理不行吗
必须要返回回去
把AJAX设为同步方式进行阻塞,等待返回结果。。。
var result = ''; $.ajax({ data: { imgSrc: capture }, dataType: 'jsonp',
async:false,
success: function (data) { result = data; } }); console.log(result );
这样不知道是否满足意思。。。
@Mr h...: 同步也不行
@dudu: 那把回调函数放到replace之前 行不行
你要知道 你这个 是 异步的 !
ajax是异步的直接return的方式显然是不行,建议的做法是直接将要对数据进行处理的函数,在方法中传递进来,这样就达到了数据处理的效果;
如果非要返回的话,建议定义一个类似消息队列的处理方式来达到这个效果,个人感觉必须返回回去的难度有点大
楼上+1