Асинхронный UI в AspNetCore

221
20 мая 2018, 12:40

View:

<div>
    @for (int i = 0; i < 2; i++)
    {
        <h2>Instant content</h2>
        <p>Delayed content (DbRequest(@i))</p>
    }
</div>

Controller:

public string DbRequest(int i)
{
    //heavy query
    return "result";
}

Смысл в том, чтобы загрузилась страница, а контент с запросами догрузился по ходу.

Upd#1:
View:

@for (int i = 0; i < 10; i++)
{
    <h2>Instant content</h2>
    <p id="@i"></p>
}
<script>
    function RequestString() {
        var index = 0;
        var request = new XMLHttpRequest();
        request.open("GET", "/Home/GetString/?index=" + index);
        request.send(index);
        request.onreadystatechange = function () {
            if (request.status == 200) {
                obj = document.getElementById(index);
                if (obj != null) {
                    obj.innerHTML = request.responseText;
                } else {
                    alert("obj is null");
                }
            }
        }
        var index2 = 9;
        var request2 = new XMLHttpRequest();
        request2.open("GET", "/Home/GetString/?index=" + index2);
        request2.send();
        request2.onreadystatechange = function () {
            if (request2.status == 200) {
                obj = document.getElementById(index2);
                if (obj != null) {
                    obj.innerHTML = request2.responseText;
                } else {
                    alert("obj is null");
                }
            }
        }
    }
    document.onreadystatechange = RequestString();
</script>

Controll:

public async Task<string> GetString(int? index)
{
    if (index == null) return "null index string";
    await Task.Delay(index.Value * 1000);
    return index + " string";
}  

Осталось решить вопрос с асинхронным циклом в скрипте. for-loop из 10 итераций делает 10 запросов с последним индексом.

Answer 1

View:

@for (int i = 0; i < 10; i++)
{
    <h2>Instant content</h2>
    <p id="@i"></p>
}
<div>Log</div>
<div id="log"></div>
<script>
    function Log(message) {
        var logElement = document.getElementById('log');
        var firstChildElement = logElement.firstChild;
        var newChildElement = document.createElement('p');
        newChildElement.innerHTML = "Message: " + message;
        if (firstChildElement == null) {
            logElement.appendChild(newChildElement);
        } else {
            logElement.insertBefore(newChildElement, firstChildElement);
        }
    }
    function Request(index) {
        var request = new XMLHttpRequest();
        request.open("GET", "/Home/GetString/?index=" + index);
        request.send();
        request.onreadystatechange = function () {
            if (request.status == 200) {
                obj = document.getElementById(index);
                if (obj != null) {
                    obj.innerHTML = request.responseText;
                } else {
                    Log("obj " + index + " is null");
                }
            } else {
                Log("Bad request");
            }
        }
    }
    function RequestStrings() {
        for (var i = 0; i < 10; i++) {
            Request(i);
        }
    }
    document.onreadystatechange = RequestStrings();
</script>  

Controller:

private readonly Random rnd = new Random();
public async Task<string> GetString(int? index)
{
    if (index == null) return "null index string";
    await Task.Delay(rnd.Next(1, 12) * 1000);
    return index + " string";
}
READ ALSO
Добавление переносов в строке в JS

Добавление переносов в строке в JS

Есть JQ код, читаю содержимое textarea, и вывожу его в определенный DIVПроблема в том, что в textarea я могу написать тест с переносами строк, и даже в консоль...

184
Кроссдоменные запросы Angular2

Кроссдоменные запросы Angular2

Как отправить кроссдоменный запрос на время тестирования приложения на Angular2Это только через сервер делается или на клиенте можно решить?

260
Webpack + node.js

Webpack + node.js

Всем доброго дняВопрос возможно глупый но я без понятия как его разобрать

205
Как создать эффект кнопки поиска без использование css:focus-а?

Как создать эффект кнопки поиска без использование css:focus-а?

Есть кнопка поиска который при фокусе плавно увеличивается ширина

225