我正在使用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。
答案 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
变量。