【问题标题】:sort array while async.map running在 async.map 运行时对数组进行排序
【发布时间】:2016-02-24 16:22:56
【问题描述】:

我使用异步映射来执行一个函数并为数组中的每个项目获取一些统计信息。

async.map(myarray,myfunc,function(err,res) ...

同时,myarray 可能会通过用户交互进行排序和更改索引。考虑到 myfunc 正在尝试修改数组,这将如何公平。

【问题讨论】:

    标签: javascript async.js


    【解决方案1】:

    当您将myarray 传递给async.map() 时,它会同步创建数组的副本。所以,你可以随意修改myarrayasync.map() 将简单地对原始数组的副本进行操作并返回一个新数组。尝试运行以下示例:

    var array = [1, 2, 3];
    
    function timesTwo(n, done) {
      setTimeout(function() {
        done(null, n * 2);
      }, 2000);
    }
    
    $(document).ready(function() {
    
    setTimeout(function() {
      array.pop();
      $('#pop').text(array);
    }, 1000);
    
    async.map(array, timesTwo, function(err, result) {
      $('#result').text(result);
      $('#original').text(array);
    });
    
    });
    span {
      color: red;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/async/1.5.2/async.js"></script>
    <p> 0ms: Original array passed to async.map(): <span>1,2,3</span></p>
    <p> 1000ms: Pop last item of original array: <span id="pop"></span></p>
    <p> 2000ms: Result of async.map(): <span id="result"></span></p>
    <p> 2000ms: Original array: <span id="original"></span></p>

    【讨论】:

    • 也许我在错误的上下文中使用了 async.map。在我的情况下,您的函数 timesTwo 会尝试更改值 n。像 n = n*2
    • 这种变化肯定会反映在原始数组中。
    • @JabranSaeed 我不确定这是怎么回事。我看过source code,很明显回调是用一个新数组调用的。尽管数组不是深层副本,但如果您对对象进行操作,这可能就是问题所在(从问题中不清楚您的数组包含什么)。您能否扩展您的问题以准确显示您在做什么?我认为我们可以解决这个问题,但并非没有更多信息。
    猜你喜欢
    • 2017-09-02
    • 2021-10-15
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 2018-08-02
    相关资源
    最近更新 更多