Javascript 不是真正的异步?

Javascript 不是真正的异步?,javascript,asynchronous,Javascript,Asynchronous,我有一个大约18000个元素的数组。我正在创建一个地图应用程序,当用户放大到某个级别时,我想在其中添加元素 因此,当用户放大到9i循环tru下时,数组将查找视图中的元素 但是,在元素之间循环确实需要一些时间,这会导致地图应用程序在用户每次缩小和缩小“级别9”时出现延迟。即使没有要添加或不添加的元素,我想瓶颈是循环 我尝试通过异步解决它,如下所示: function SearchElements(elementArr) { var ret =

我有一个大约18000个元素的数组。我正在创建一个地图应用程序,当用户放大到某个级别时,我想在其中添加元素

因此,当用户放大到9i循环tru下时,数组将查找视图中的元素

但是,在元素之间循环确实需要一些时间,这会导致地图应用程序在用户每次缩小和缩小“级别9”时出现延迟。即使没有要添加或不添加的元素,我想瓶颈是循环

我尝试通过异步解决它,如下所示:

          function SearchElements(elementArr) {

                var ret = new Promise(resolve => {

                var arr = [];

                for (var i in elementArr) {

                    var distanceFromCenter = getDistanceFromLatLonInKm(view.center.latitude, view.center.longitude, dynamicsEntities[i].pss_latitude, dynamicsEntities[i].pss_longitude);
                    var viewWidthInKm = getSceneWidthInKm(view, true);

                    if (distanceFromCenter > viewWidthInKm) continue;

                    arr.push(elementArr[i]);
                }

                resolve(arr);
            });

            return ret;
        }

        SearchElements(myElementsArray).Then(arr => {
            // ... 
        });

但是它仍然不是异步的,当for循环运行时,此方法挂起。

因为在一个循环中仍然有一个紧密的循环,它循环了所有元素,所以总是会有响应问题

解决这个问题的一种方法是处理数据块

注意:我假设elementArr是一个javascript数组

function SearchElements(elementArr) {
    var sliceLength = 100; // how many elements to work on at a time
    var totalLength = elementArr.length;
    var slices = ((totalLength + sliceLength - 1) / sliceLength) | 0; // integer
    return Array.from({length:slices})
    .reduce((promise, unused, outerIndex) => 
        promise.then(results => 
            Promise.resolve(elementArr.slice(outerIndex * sliceLength, sliceLength).map((item, innerIndex) => {
                const i = outerIndex * sliceLength + innerIndex;
                const distanceFromCenter = getDistanceFromLatLonInKm(view.center.latitude, view.center.longitude, dynamicsEntities[i].pss_latitude, dynamicsEntities[i].pss_longitude);
                const viewWidthInKm = getSceneWidthInKm(view, true);
                if (distanceFromCenter <= viewWidthInKm) {
                    return item; // this is like your `push`
                }
                // if distanceFromCenter > viewWidthInKm, return value will be `undefined`, filtered out later - this is like your `continue`
            })).then(batch => results.concat(batch)) // concatenate to results
        ), Promise.resolve([]))
    .then(results => results.filter(v => v !== undefined)); // filter out the "undefined"
}
我在评论中的另一个建议是WebWorkers(我最初称之为worker threads,不知道这个词是从哪里来的)——不过,我对WebWorkers还不够熟悉,无法提供解决方案,应该可以让您继续

老实说,我认为这种
繁重的
任务更适合网络工作者


我想/希望
return-re
而不是
return-ret
只是你问题的一个输入错误。异步和并行是不同的。请参阅以获取解释。您的代码在promise
for(elementArr中的var i)中仍然有一个可能非常昂贵的(同步)循环{
…这仍然会导致问题……你需要将工作分解成更小的部分,甚至使用工作线程或孩子们现在喜欢的任何东西:p@JaromandaX我想这一点可以成为一个答案…也许没有孩子的部分,我想孩子们已经长出皱纹和/或胡须了;-)Jaromanda X嗨,我怎么能使用worker t线程?
SearchElements(yourDataArray).then(results => {
    // all results available here
});