2017-06-17 73 views
0

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

的阵列,而不是使用'forEach'用'push' - 使用map'的'的组合和'Promise.all' - 然后你不必编写一个不符合PromiseA +标准的自定义承诺实现 –

+0

如果你想要更简单的更改,你也可以'解析(Promise.all(recommendationCacheUrls))' –

回答

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可以解决何时迭代参数中的所有promise都已解析或迭代参数不包含promise的情况。它拒绝了拒绝的第一个承诺的原因。 - https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

所以,代码映射providedUrlsfileTransfer.download ... .then返回的承诺 - 在{ name: url.name, url: entry.toURL() }对象。

Promise.all等待所有这些承诺履行,并解决这些对象

+0

你能否给我一个关于'_.map'的简要说明和'Promise.all'? – Sampath

+0

Thanks.But你是如何做到这一点'recommendationCacheUrls.push()'?即如何在您的代码中发生? – Sampath

+0

被'map'替换...'var otherArray = []; array.forEach(item => otherArray.push(item.key)); doSomething(otherArray)'相当于'doSomething(array.map(item => item.key));' –