首先,我假設回調收到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