javascript - 等待 Javascript 函数在 foreach cshtml 中完成?

标签 javascript asp.net-mvc asp.net-mvc-4 razor

我正在尝试用 Javascript 制作简单的自动输入。我的问题是,如果我从 View (.cshtml)调用它,自动类型无法按顺序运行。

我的cshtml是这样的:

<script type="text/javascript" src="@Url.Content("/Scripts/autotype.js")"></script>

@foreach (var temp in @Model)
{
    <script>
        auto_type("ABCDEFG", 0)
    </script>
}

<div id="divauto"></div>

它是 autotype.js :

function auto_type(wrt, i) {

    wrt = wrt.split('');
    var delay = 100;
    while (i < wrt.length) {
        setTimeout(function () {
            $('#divauto').append(wrt.shift())
        }, delay * i)
        i++;
    }
}

从这些代码中,输出将类似于“AAABBBCCCDDDEEEFFFGGG”,但我需要如下输出:“ABCDEFGABCDEFGABCDEFG”

最佳答案

您可以使用jQuery deferreds来做到这一点。在这种情况下,我必须使用两个递归函数,因为您需要通过 viewItems 列表进行迭代以及启动 setInterval() 来更新 #divAuto 的流程控制对于每个 Angular 色。

作为此处如何使用 Promise 来添加控制的示例,在 autoType() 中,您将获得从新的 autoTypeUtil() 返回的 Promise。当在 autoTypeUtil() 中解决 Promise 时,您可以使用剩余的列表再次调用 autoType()。这使您可以在异步运行的同时对输入项进行流控制。

您可以查看fiddle一个工作示例。

function timeString(arr, timeFactor, deferred) {
    if (arr.length === 0) { deferred.resolve(); }

    var ch = arr.shift();
    var deferredInternal = new $.Deferred();
    var promise = deferredInternal.promise();
    var delay = 100;

    setTimeout(function () {
        $('#divauto').append(ch);
        deferredInternal.resolve("done");
    }, delay * timeFactor)

    promise.done(function() { 
        timeString(arr, timeFactor, deferred); 
    });
}

function autoTypeUtil(inputString, timeFactor) {
    var deferredTimeString = new $.Deferred();
    var deferredInternal = new $.Deferred();
    var promiseTimeString = deferredTimeString.promise();

    inputString = inputString.split('');
    timeString(inputString, timeFactor, deferredTimeString);

    promiseTimeString.then(function() {
        deferredInternal.resolve()
    });
    return deferredInternal.promise();
}

function autoType(arr, timeFactor) {
    if (arr.length === 0) { return; }

    var promise = autoTypeUtil(arr.shift(), timeFactor);

    promise.done(function() {
        autoType(arr, timeFactor);
    });
}

var viewItems = ["I", "love", "jQuery", "promises"];
autoType(viewItems, 1);

关于javascript - 等待 Javascript 函数在 foreach cshtml 中完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27235531/

相关文章:

html - 如何在 CSS 中为 MVC 4 Razor 创建类层次结构?

javascript - 关于 JS 中 OOP 的一些基本问题

javascript - Angular 将对象元素绑定(bind)到 HTML

javascript - 在当前时间之前 10 分钟使用 Google App Script 从 Gmail 获取电子邮件

asp.net - IIS URL 重写与 URL 路由

javascript - Chrome 在将图像从一个元素移动到另一个元素时重新加载图像,而 Firefox 和 Internet Explorer 只是*移动*图像。我该如何解决这个问题?

javascript - 如何使用 Highcharts 和可滚动数据将页面内容导出为 jpg 或 pdf?

asp.net-mvc - Entity Framework /MVC。如何防止在不选择新图像的情况下更新当前记录时删除保存在数据库中的图像 blob

javascript - 允许 MVC 将 Controller 操作响应视为静态内容

c# - IEnumerable<T> 以某种方式转换为 EntitySet<T>