我需要写一个自定义promise
。我已经尝试过如下所示。但问题是如何在内部承诺也解决之后获得recommendationCacheUrls
值?即fileTransfer.download
承诺。
setNewCacheUrls(providedUrls: any, nativeURL: string): Promise<any> {
return new Promise((resolve, reject) => {
let recommendationCacheUrls = [];
_.forEach(providedUrls, (url) => {
const fileTransfer: TransferObject = this.transfer.create();
fileTransfer.download(url.url, nativeURL + url.name).then((entry) => {
recommendationCacheUrls.push({ name: url.name, url: entry.toURL() });
}, (error) => {
console.error('error: ' + error);
});
});
resolve(recommendationCacheUrls);
});
}
答案 0 :(得分:1)
您可以使用Array map
(如果必须,还是_.map)和Promise.all
setNewCacheUrls(providedUrls: any, nativeURL: string): Promise<any> {
return Promise.all(_.map(providedUrls, url => {
const fileTransfer: TransferObject = this.transfer.create();
return fileTransfer.download(url.url, nativeURL + url.name)
.then((entry) => ({ name: url.name, url: entry.toURL() }));
}));
}
_.map
- 通过转换函数映射列表中的每个值来生成新的值数组 - http://underscorejs.org/#map
Promise.all
- 返回单个Promise,当可迭代参数中的所有promise都已解析或者iterable参数不包含promise时,它将解析。它拒绝承认拒绝的第一个承诺。 - https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all
因此,代码将providedUrls
映射到fileTransfer.download ... .then
- { name: url.name, url: entry.toURL() }
个对象返回的承诺。
Promise.all
等待所有这些承诺,并解析为这些对象的数组