首先,我假设回调收到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
没有。
您还可以使用ES5的bind
如果回调看到this
不必通过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
,直到我们看到回调所有斑点。另外请注意,我们不只是将push
添加到新阵列中,因为它们可能无序到达(理论上)。当然,如果订单无关紧要,push
就不用了,你不再需要count
变量了。
感谢您的详细回复!澄清一下,在你调用useTheNewArray();的地方,你的意思是直接拷贝上一个InkBlobs数组吗? – muttley91
另外,如果我没有使用'bind()'方法,我是否也必须将元数据传递给'makeCallback()'? – muttley91
出于某种原因,这实际上并不适合我。我尝试了bind()和without(前一种方法和后一种方法),数据数组保持空白。我想这可能是,但是我试图'useNewArray()',但我不确定除了直接复制或返回数组外,还有什么可以做的。 – muttley91