我正在重構一些原本沒有編寫的遺留代碼,並且我遇到了異步數據加載的問題。第一次打開一個特定的模式時,表示一個表單對象的一堆數據被加載。然後一個函數循環遍歷表單的輸入,並根據需要將其充實。它看起來是這樣的(極度簡化):有條件的異步調用
component.inputs.forEach(function(input) {
if (input.field == 'foo') {
input.cols = 5;
//etc.
}
if (input.field == 'bar') {
DataService.getBars().then(function(data){
data.forEach(function(e){
input.options.push(e.description);
});
};
}
if (input.field == 'baz') {
input.pattern = /regex/;
//etc.
}
});
return component;
的問題,當然,如果我的input.field是「酒吧」,代碼繼續運行,打異步調用的DataService前的最後返回已解決,因此第一次打開模式時,input.options尚未填入'bar'輸入。
是否有可能讓代碼等待來自DataService的承諾在繼續之前被解析,或者有另一種方式來處理這種情況:在大多數情況下,該函數是同步的,但必須在該函數中進行異步調用只有一種情況?或者,我是否通過在這個大型的ifs鏈中包含異步調用來打擊自己?
這裏真正的問題是,您應該進行一次寧靜的調用以返回所有需要的潛在數據。一旦你有了數據,你應該繼續進行映射,最後返回模態。 –
@David L.一個有趣的觀點。我想我可以將整個函數包裝在DataService調用的.then中,但是不管這些數據是否需要,我們都必須進行調用。此外,這個方法非常大(上面的例子是一個很大的簡化),所以它會很笨拙,不友好。 –
我會改變對象結構,所以如果你不需要打電話,你不會。因爲它現在存在,你在這種模式流行音樂中效率非常低。 –