使用匿名函数向数组中的JavaScript对象添加值
我用它来储存图像。我正在尝试使用它们的使用匿名函数向数组中的JavaScript对象添加值,javascript,Javascript,我用它来储存图像。我正在尝试使用它们的filepicker.stat()函数获取图像的元数据。但是,虽然它允许我在内部像这样处理元数据: filepicker.stat(InkBlobs[i], { width: true, height: true }, function(metadata){ console.log(JSON.stringify(metadata)) }); 我无法从匿名函数中获取元数据。我想做的是这样的: for(i = 0; i < InkBlobs.length
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)); });
}
for(i=0;i
这显然不起作用(InkBlobs[i].add(…))部分,那么如何捕获该元数据并将其包含在数组中的其他数据中呢?数组内容可以是
JSON.stringify()
'd.首先,我假设回调接收元数据作为参数;问题中的代码中缺少了这一点,但我将在下面进行假设
基本上你可以做你写的,你只需要稍微不同地管理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
we passbind
显示在stat
提供的任何参数前面(在我的示例中,bind
的第一个参数null
是在回调期间设置此
)
从这里开始,我将使用bind
,因为它更简洁
现在我们必须用InkBlob存储元数据。这里有一个方法:
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));
}
var数据=[];
var计数=0;
对于(i=0;i
注意,我们等待调用usetenewarray
,直到看到所有blob的回调。还要注意的是,我们不只是将
推送到新数组,因为它们可能会(理论上)出现故障。当然,如果顺序不重要,推开
,您就不再需要计数
变量了。谢谢您的详细回复!只是想澄清一下,在哪里调用useTheNewArray()
,你的意思是直接复制上一个InkBlobs数组吗?另外,如果我没有使用bind()
方法,我是否也必须将元数据传递到makeCallback()
?出于某种原因,这实际上对我不起作用。我尝试了使用bind()
和不使用(前一种方法和后一种方法),数据数组保持为空。我想这可能是因为我试图useNewArray()
,但我不确定除了直接复制或返回数组之外,你还能做些什么。@rar:“使用”是指……使用。索引到其中并使用其中的对象执行操作,而不是使用InkBlobs
。不,您不必将元数据
传递到makeCallback
--makeCallback
的工作是创建stat
将使用元数据
参数调用的函数。啊,好的。我发现它令人困惑,因为直到for循环完成之后,我才真正使用InkBlobs
数组。我只是想在for循环之外使用元数据之前,通过向每个对象添加元数据来修改每个对象的内容。
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));
}