使用匿名函数向Array中的JavaScript对象添加值

时间:2014-07-22 17:30:43

标签: javascript

我正在使用Filepicker.io来存储图片。我正在尝试使用filepicker.stat()函数获取图像的元数据。但是,它允许我在内部使用元数据,如下所示:

filepicker.stat(InkBlobs[i], { width: true, height: true }, function(metadata){ console.log(JSON.stringify(metadata)) });

我无法从该匿名函数中获取元数据。我想做的是这样的事情:

for(i = 0; i < InkBlobs.length; i++)
{
    filepicker.stat(InkBlobs[i], { width: true, height: true }, function(metadata){ InkBlobs[i].add(JSON.stringify(metadata)); });
}

这显然不起作用(InkBlobs[i].add( ... ))部分,那么如何捕获元数据并将其与数组中的其他数据一起包含?数组内容均可为JSON.stringify()'d。

1 个答案:

答案 0 :(得分:1)

首先,我假设回调接收metadata作为参数;问题中的代码中缺少这个,但我将在下面假设。

你基本上可以做你写的东西,你只需稍微不同地管理i并有一个地方存储它。由于这是JavaScript,您可以将自己的属性添加到InkBlob实例,但这通常有点危险(如果您与非公开的内容冲突,或者他们在下一个版本中添加类似于对象的内容)等等。)。

首先让我们处理i

for(i = 0; i < InkBlobs.length; i++)
{
    filepicker.stat(InkBlobs[i], { width: true, height: true }, makeCallback(i));
}
function makeCallback(index) {
    return function(metadata){
        InkBlobs[index].add(JSON.stringify(metadata));
        // This bit ^^ is still theoretical
    };
}

现在,我们的回调不是关闭i,而是关闭index,这是我们在循环中调用它时传递给makeCallback的参数。在回调发生前i发生变化的地方,index没有。{/ p>

如果回调看到的bind不必由this控制,您也可以使用ES5的stat

for(i = 0; i < InkBlobs.length; i++)
{
    filepicker.stat(InkBlobs[i], { width: true, height: true }, function(index, metadata){
        InkBlobs[index].add(JSON.stringify(metadata));
        // This bit ^^ is still theoretical
    }.bind(null, i));
}

请注意,我们传递i的参数bind显示在stat提供的任何参数前面(我bind的第一个参数,null例如,在回调期间设置this

我将从这里开始使用bind,因为它更简洁。

现在我们必须使用inkblobs存储元数据。这是一种方式:

var data = [];
var count = 0;
for(i = 0; i < InkBlobs.length; i++)
{
    filepicker.stat(InkBlobs[i], { width: true, height: true }, function(index, metadata){
        data[index] = {
            blob:     InkBlobs[index],
            metadata: metadata // No reason to stringify it that I know of, but you could
        };
        ++count;
        if (count === InkBlobs.length) {
            useTheNewArray();
        }
    }.bind(null, i));
}

请注意,我们等待调用useTheNewArray,直到我们看到所有blob的回调。另请注意,我们不只是push到新数组,因为它们可能无序到达(理论上)。当然,如果订单无关紧要,push离开,您不再需要count变量。