Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 替换函数中的异步加载_Javascript_Asynchronous_Replace_Callback - Fatal编程技术网

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

我正在使用Javascript替换。我是这样做的:

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,我终于在晚上做了。两步解决方案。这种方法对我有效!这比我想象的要容易。非常感谢你!非常好的使用承诺的解决方案,它可以很容易地修改为一个版本,如果任何人不能使用承诺,它就不使用承诺。