我有两个函数正在开始异步加载资源。如何让他们返回承诺,我可以等到装载完成?
// #1
LoadMaps() {
gFileService.getFile('syn-maps.json').then(
mapItem => this.synMaps = mapItem
).then(
gFileService.getFile('sense-maps.json').then(
mapItem => this.senseMaps = mapItem
)
);
}
// #2
LoadListAndMetadata() {
gListService.getList().then(lexList => {
let promises = [];
lexList.forEach(lexItem => {
lexItem.selected = false;
this.lexList[lexItem.lexId] = lexItem;
if (lexItem.hasMeta) {
promises.push(gFileService.getFile(lexItem.metaFile).then(
metaItem => this.metadata[lexItem.lexId] = metaItem
));
}
});
$.when(...promises).then(
() => $.templates('#lexSelectionTemplate').link('#lexSelection', this)
);
});
}
我想获得一个Promise(或两个),以便我可以等到两个完成,即文件已加载并且模板已链接。我只是不知道如何获得它们以便它们可以被退回。简单地将return
放在每个函数的第一行前面将不会返回嵌套任务的正确值。我是否必须在此更改设计以便能够等待最里面的任务?
答案 0 :(得分:1)
简单地将
return
放在每个函数的第一行前面将不会为嵌套任务返回正确的
实际上它会。你确定你把它放在所有四个函数的第一行吗?
LoadMaps() {
return gFileService.getFile('syn-maps.json').then(
//^^^^^^
mapItem => this.synMaps = mapItem
).then(() => { // <== admittedly, you forgot this entire function
return gFileService.getFile('sense-maps.json').then(
// ^^^^^^
mapItem => this.senseMaps = mapItem
)
});
}
LoadListAndMetadata() {
return gListService.getList().then(lexList => {
//^^^^^^
let promises = [];
lexList.forEach(lexItem => {
lexItem.selected = false;
this.lexList[lexItem.lexId] = lexItem;
if (lexItem.hasMeta) {
promises.push(gFileService.getFile(lexItem.metaFile).then(
metaItem => this.metadata[lexItem.lexId] = metaItem
));
}
});
return Promise.all(promises).then(
// ^^^^^^
() => $.templates('#lexSelectionTemplate').link('#lexSelection', this)
);
});
}
关于LoadMaps
,您可能一直在考虑同时运行两个getFile
调用。您可以再次使用Promise.all
执行此操作:
LoadMaps() {
return Promise.all([
//^^^^^^
gFileService.getFile('syn-maps.json').then(mapItem =>
this.synMaps = mapItem
),
gFileService.getFile('sense-maps.json').then(mapItem =>
this.senseMaps = mapItem
)
]);
}
甚至
LoadMaps() {
return Promise.all([
gFileService.getFile('syn-maps.json'),
gFileService.getFile('sense-maps.json')
]).then(results => {
[this.synMaps, this.senseMaps] = results
});
}
答案 1 :(得分:1)
如果您只需知道最后一次通话何时完成,您只需使用此骨架:
function firstCall() {
return new Promise((y,n) => setTimeout( () => y('firstCall'), 500 ));
}
function secondCall() {
return new Promise((y,n) => setTimeout( () => y('secondCall'), 800 ));
}
function promiseTest() {
Promise.all([
firstCall(),
secondCall()
]).then( function(data) {
console.log( data );
})
.catch( function(err) {
console.log( 'Error executing promisses.', err );
});
}
promiseTest();