等待array.map中的异步进程等待

时间:2016-02-10 14:39:29

标签: javascript node.js asynchronous

我使用名为exiftool的node.js包,它基本上是一个名为exiftool的bash脚本的API。后面的过程是异步的,我很难弄清楚在返回所有内容之前如何等待异步完成。

代码:

  MAP.files = MAP.scan.map((scan) => {
    file = {};
    exiftool.metadata(scan, function(error, metadata) {
      if (metadata) { return file; }
      file.metadata = metadata;
    });
    return file;
  });

因此,当我尝试访问MAP.files时,结果将是几个空对象。我理解为什么,但是......我怎么能避免这种不渴望的结果呢?

感谢。

2 个答案:

答案 0 :(得分:1)

您可以使用promises来组织异步函数行为,看看https://www.promisejs.org/

答案 1 :(得分:0)

如果您异步获取,则无法返回所需的结果。我会这样解决(这是未经测试的):

var MapMetadata = function(map, callback)
{
    map.files = {};
    var callbackCount = 0;
    var callbackMaxCount = Object.keys(map.scan).length;
    var metadataCallback = function(key, metadata)
    {
        map.files[key] = metadata;
        callbackCount++;
        if (callbackCount == callbackMaxCount && callback != null)
            callback(map);
    }

    for (var i in map.scan)
    {
        GetMetadata(i, map.scan[i], metadataCallback);
    }
}

var GetMetadata = function(key, scan, callback)
{
    exiftool.metadata(scan, function(error, metadata)
    {
        var result = {};
        if (metadata)
            result.metadata = metadata;

        callback(key, result);
    });
}

MapMetadata(MAP, function(result)
{
    console.log(result);
}