gpt4 book ai didi

javascript - 将同步功能转换为异步功能

转载 作者:行者123 更新时间:2023-12-03 10:19:07 25 4
gpt4 key购买 nike

我正在尝试将一系列同步调用转换为异步,并且我正在使用when...done...我对这个东西很陌生,但是从我在这个主题上所做的所有阅读来看最近两天,我下面的代码应该可以工作。嗯,它确实有效,但并不完全按照我的意思。

在下面的测试代码中,我进行了五个调用,每个调用都需要不同的时间(在我的示例中,它基于字符串的长度......每个字符 1/2 秒)。我的期望是,花费较少时间的调用(即我的示例中长度较短的字符串)将首先完成,我快速触发所有五个调用,并希望结果按照从较短执行到较长执行的顺序显示。

这是我的代码:

var cars = ["Saab", "Chrysler", "Volvo", "BMW", "GT"];
loopAll(cars);
document.getElementById("demo").innerHTML += "Start!<br>";
function loopAll(array) {
for (var i in array) {
$.when( encapsulate(array[i]) ).done( printIt );
}
function encapsulate(name){
var a = $.Deferred();
setTimeout(function(){pause(name.length*500);a.resolve(name);}, 0);
return a;
}
}
function printIt(name){
document.getElementById("demo").innerHTML += name + "<br>";
}
function pause(ms) {
ms += new Date().getTime();
while (new Date() < ms){}
}

数组中的每个元素都会被打印出来,我可以看到它们一一弹出在显示屏上。然而,它们似乎是同步的,因为它们按照数组的原始顺序显示,并且每个显示元素之间发生暂停。然而,我的期望是较短的执行函数比较长的执行函数更快地完成(和显示)。

注意:我不想对数组进行排序。我的目的是触发多个调用,让较短的执行调用首先完成,而不是按顺序完成。我仅使用字符串数组作为示例。

最佳答案

在这种情况下,超时 block 并没有真正执行任何操作。它将立即执行其功能 block 。

JavaScript 是单线程的,通过使用自制的“暂停”方法,您可以有效地阻塞线程并导致每个循环同步执行。

如果您有一些同步代码,并且异步替代方案不可用,您可以使用 Web Worker 将它们从主线程中移出。

http://www.html5rocks.com/en/tutorials/workers/basics/

关于javascript - 将同步功能转换为异步功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29724228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com