Javascript 替换函数中的异步加载
我正在使用Javascript替换。我是这样做的:Javascript 替换函数中的异步加载,javascript,asynchronous,replace,callback,Javascript,Asynchronous,Replace,Callback,我正在使用Javascript替换。我是这样做的: var replacedText = originalText.replace(regex, function(value, i) { return value + 'some_additional_data'; }); return replacedText; 但是现在我需要在replace方法中加载一个HTML模板。通过以下方式调用load方法: res.render(location, json, function(erro
var replacedText = originalText.replace(regex, function(value, i) {
return value + 'some_additional_data';
});
return replacedText;
但是现在我需要在replace方法中加载一个HTML模板。通过以下方式调用load方法:
res.render(location, json, function(error, html) {
//i have the html loaded with my json data
});
我需要将其加载到我的replace方法中,但我无法执行此操作:
var replacedText = originalText.replace(media, function(value, i) {
var json = buildJSON(value);
res.render(location, json, function(error, html) {
//how could i return the "html" object for the replace function?
});
});
我尝试过类似的方法,但没有成功:
var replacedText = originalText.replace(media, function(value, i) {
var json = buildJSON(value);
return res.render(location, json, function(error, html) {
return html;
});
});
任何帮助都将不胜感激
非常感谢您当您有一个需要同步返回值的回调时,您不能在该回调中使用异步操作来获取该值。异步操作(根据定义)将在回调返回后的某个时间完成,因此无法从回调返回异步操作的结果,也无法让JS等待异步操作 我并不完全理解您的代码试图做什么,但从您的文字判断,听起来您想加载一个HTML模板并在替换操作中使用它。有一些不同的方法来解决这个问题 例如,您可以通过两次传递来完成此操作
function replaceAsync(str, re, callback) {
// http://es5.github.io/#x15.5.4.11
str = String(str);
var parts = [],
i = 0;
if (Object.prototype.toString.call(re) == "[object RegExp]") {
if (re.global)
re.lastIndex = i;
var m;
while (m = re.exec(str)) {
var args = m.concat([m.index, m.input]);
parts.push(str.slice(i, m.index), callback.apply(null, args));
i = re.lastIndex;
if (!re.global)
break; // for non-global regexes only take the first match
if (m[0].length == 0)
re.lastIndex++;
}
} else {
re = String(re);
i = str.indexOf(re);
parts.push(str.slice(0, i), callback.apply(null, [re, i, str]));
i += re.length;
}
parts.push(str.slice(i));
return Promise.all(parts).then(function(strings) {
return strings.join("");
});
}
你想做的事是不可能的。你知道函数是异步的意味着什么吗?是的,我想它。。。我会用另一种方式来做。感谢you@FelixKling,我终于在晚上做了。两步解决方案。这种方法对我有效!这比我想象的要容易。非常感谢你!非常好的使用承诺的解决方案,它可以很容易地修改为一个版本,如果任何人不能使用承诺,它就不使用承诺。