也解决内心的承诺

时间:2017-06-17 01:09:46

标签: angular typescript promise

我需要写一个自定义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);
});

}

1 个答案:

答案 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等待所有这些承诺,并解析为这些对象的数组