【问题标题】:async map overwriting the array objects异步映射覆盖数组对象
【发布时间】:2014-07-21 16:03:49
【问题描述】:

我有一个 async.map 必须在其上运行的数组。就每个数组对象的并行运行而言,该功能很好,它被记录为“...的结果”。但是,迭代函数的返回回调似乎用准备好的最后一个对象的结果覆盖了第一个数组对象,记录为“最终结果...”。

async.map(array, getInfo, function (asyncError, asyncStatus) 
{        
    if(asyncError)
    {
        return callback(asyncError);           
    }
    else
    {
        console.log(' Final Result <<<<<<<<<<<------- '+JSON.stringify(asyncStatus));
        //return callback(null, asyncStatus);  
    }
});

function getInfo(passedArray, callback) 
{
    Analyser(passedArray.productName, passedArray.productPurchaseRecord, function(opError, opStatus)
    {
        if(opError)
        {
            return callback(opError);           
        }
        else
        {  
            console.log(' Result for '+passedArray.productName+' ------->>>>>> '+JSON.stringify(opStatus));
            return callback(null, opStatus);  
        }
    });            
} 

输出:-

Result for bmwX1 ------->>>>>> [{"month":"January","totalSales":8,"newOrders":3}]
Result for AudiA4 ------->>>>>> [{"month":"January","totalSales":11,"newOrders":4}]
Final Result <<<<<<<<<<<------- [[{"month":"January","totalSales":8,"newOrders":3}],[{"month":"January","totalSales":8,"newOrders":3}]]

【问题讨论】:

  • 什么是Analyser?有可能重用对象吗?你的异步逻辑对我来说很好。
  • @loganfsmyth Analyzer 是一个子功能,它使用passedArray 对象进行一些数据分解/分析并返回一个数组,该数组由“opStatus”接收并打印为“Result for ...”[侧边栏]我已经尝试过异步每种方法。它似乎也有一个问题,尽管在那里,只要每个中的并行控制流返回一个对象,我就会将对象推送到一个数组中。问题似乎出现在推送完成时,在一个公共数组中推送的最后一个对象正在覆盖所有其他对象,其中数组的大小保持为“n”个对象。

标签: javascript arrays node.js asynchronous


【解决方案1】:

试试scramjetES6 async/await

您的代码看起来有点像这样:

try {
    const result = await scramjet.fromArray(array)
        .reduce(async (last, item) => getInfo(item))
} catch (e) {
    console.error("error", e)
}

你需要稍微改变 getingo 函数,像这样异步:

async function getInfo(passedArray, callback) {
    return new Promise(resolve, reject) {
        Analyser(passedArray.productName, passedArray.productPurchaseRecord, 
            function(opError, opStatus) {
                if(opError) {
                    return reject(opError);
                } else {
                    console.log(' Result for '+passedArray.productName+' ------->>>>>> '+JSON.stringify(opStatus));
                    return resolve(opStatus);
               }
        });
}

这提供了一个漂亮、干净的代码,并且代码是一个接一个地运行的(如果你想并行运行代码,你可以使用 map)。 reduce 方法运行起来很像Array.prototype.reduce

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-15
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多