2017-06-17 11 views
0

私はカスタムを書く必要があります。私は以下のように試しました。しかし、内部の約束が解決された後に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

のアレイに解決 - 'map'と' Promise.all'の組み合わせを使用し - 次いでPromiseA +に準拠していないカスタムプロミスの実装を書く必要はありません –

+0

簡単な変更が必要な場合は、 'resolve(Promise.all(recommendationCacheUrls))'を実行することもできます –

答えて

1

あなたは(あなたがしなければならない場合や_.map)Array 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 - iterable引数内のすべての約束が解決されたとき、またはiterable引数が約束を含まないときに解決する単一のPromiseを返します。それは拒絶するという最初の約束の理由で拒否する。 - { name: url.name, url: entry.toURL() }オブジェクト - https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

ので、コードがfileTransfer.download ... .thenによって返された約束にprovidedUrlsをマッピングします。

Promise.all満たすためにすべてのそれらの約束を待ち、むしろ `push`と` forEach`を使用するよりも、それらのオブジェクト

+0

'_.map'に関する簡単な説明を教えてください。 「Promise.all」? – Sampath

+0

ありがとうございます。しかし、この 'recommendationCacheUrls.push()'はどうしたのですか?すなわち、あなたのコードではどうなっていますか? – Sampath

+0

は 'map'で置き換えられました...' var otherArray = []; 'doSomething(array.map(item => item.key));' –

関連する問題