JavaScript的。请求和循环后如何返回修改后的字符串?

时间:2017-07-19 12:39:51

标签: javascript node.js loops

我想为MMA应用创建自动标记脚本。为此,我通过regexp查看文章,找到名字和姓氏,然后将匹配推送到数组

var arr = [],
    s = "Самолет из Лондона уже час, как приземлился, а красавицы-чемпионки Уимблдона все никак не появляются в зале прилета. Мимо успели прошмыгнуть футболисты детской красноярской команды, бывший игрок волейбольной сборной России Роман Яковлев с сыном Дмитрием (пока выступающим на молодежном уровне), и даже актер Олег Тактаров – явно слегка удивленный наличием камер в аэропорту, но облегченно вздохнувший, когда понял, что пресса собралась не по его душу. Еще и Лиото Мачида был там",

 re = /([А-Я][А-Яа-я]+(?=\s[А-Яа-я])(?:\s[А-Я][А-Яа-я]+)+)/g,
    item;
var final_arr = [];
while (item = re.exec(s))
    arr.push(item[1]);

// arr = ['РоманЯковлев','ОлегТактаров','ЛиотоМачида']

这可能是战士还是没有。要检查它,我正在向API发送请求。如果匹配我有200状态和json,如果不匹配404:

for(var i = 0; i < arr.length; i++) {


    var sss = encodeURIComponent(arr[i]);
    var options = {
                    url: 'https://------------------/get_fighter/'+sss,
                    method: 'GET',
                   }

    rp(options)
    .then(function (body) {
        var json = JSON.parse(body);
            var rus_name = json.rus_name;
            var vmeste_name = json.vmeste_name;
            console.log(vmeste_name)
            final_string = s.replace(rus_name, rus_name+'(#'+vmeste_name+')');
            console.log(final_string);
    })

    .catch(function (err) {
        // API call failed...
    });

如果db中有多个战斗机,现在我遇到了问题。我如何使用final_string的最后一次迭代?

1 个答案:

答案 0 :(得分:0)

var process_acquired_data = function(str){
    // do stuff with the final string
}

var processed_response_counter = 0; // added
var final_string = s; // added

for(var i = 0; i < arr.length; i++) {
    var sss = encodeURIComponent(arr[i]);
    var options = {
        url: 'https://------------------/get_fighter/'+sss,
        method: 'GET',
    }

    rp(options)
        .then(function (body) {
            var json = JSON.parse(body);
            var rus_name = json.rus_name;
            var vmeste_name = json.vmeste_name;
            console.log(vmeste_name)
            final_string = final_string.replace(rus_name, rus_name+'(#'+vmeste_name+')'); // changed
            console.log(final_string);

            processed_response_counter++;

            if(processed_response_counter == arr.length){
                process_acquired_data(final_string);
            }
        })
        .catch(function (err) {
            // API call failed...
        });
}

发生什么事了?首先我将final_string设置为s的值。然后.replace(...)将在final_string上完成。因为每当你调用s.replce(...)时,你都不会包含之前替换的值,因为你永远不会重置s。 另一方面,我已经为你已经收到的所有回复添加了一个计数器。如果我理解正确,那么您现在所有的回复都会回来......这意味着目前所有回复都会回来,您想要处理数据。因此我添加了一个回调函数(process_acquired_data),它将处理给定的字符串。在这种情况下,在做出所有回复之后。为什么我没有使用&#34;我&#34;作为柜台?很简单,当循环迭代时(例如,慢速互联网连接),可能会发生响应仍处于未决状态。

请记住,当您使用回调时,代码将异步运行。这意味着您不知道WHEN(关于时间点的代码在哪个时间)将处理回调。如果要返回数据。使用未来(在JS中它被称为我认为的承诺,并且有一个具有该名称的库)。

我希望有所帮助。