0

RNFetchBlobを使ってReact Nativeでファイルをダウンロードするコードはこちらです。Javascript約束の理解

let thumbs = [] 
    for (let i = 0; i < count; i += 1) { 
    thumbs.push(this.downloadThumb(this.state.thumbs[skip + i])) 
    } 
    Promise.all(thumbs) 
    .then(data => { 
     this.setState({ 
     totalCount: this.state.totalMarkerCount, 
     fetchedCount: skip + count 
     }) 
     this.recursive_thumb(skip + count, count) 
    }) 
    .catch(reason => { 
     this.recursive_thumb(skip + count, count) 
     this.setState({ 
     totalCount: this.state.totalMarkerCount, 
     fetchedCount: skip + count 
     }) 
    }) 

ダウンロードが完了したかどうかを確認するためにPromise.allを使用しました。

上記のコードはスレッドのように機能しますか?または正常ですか?

スレッドではない場合は、スレッドを使用してReact Nativeを使用してください。

ダウンロードサム機能はお約束の機能です。

+0

このコードは、 '.then'で関数を呼び出す前に解決するために'親指 'の約束を待っています.JavaScriptのスレッドは何ですか? –

+0

javascriptはシングルスレッドですが、リソースのダウンロードは同時に実行できますが、then()コールバックは1回だけ呼び出されるため、ここでスレッドする必要はありません –

+0

ええ、このコードはすべての約束私はこのコードがマルチスレッドのように動作したかったのです。 –

答えて

0

スレッドを待機(つまりブロック)することはありません。 then(...)に与えられた関数は、すべての約束が満たされたときに呼び出されます。

つまり、this.state.totalMarkerCountは、Promise.allを呼び出したときとは異なる値を持つ可能性があります。

ブラウザでのJSは、(あなたがwhile(true) { ... }ループで試してみて、何が起こるかを見ることができます;)あなたがスレッドをブロックすることができないことを意味し、(ここでは一瞬のWeb労働者を無視して)、シングルスレッドである)

+0

ええ、私は理解しましたが、私はforTopでdownloadThumbを呼び出しました。実際、donwloadThumbはスレッドのように呼ばれていると私は思った。それは本当ですか? –

+0

スレッドの「好き」と言うこともできますが、Promiseの機能を正しく理解できません。 downloadThumbsが呼び出されると、プロセスが完了したときに呼び出されるコールバック関連を作成する新しいPromiseインスタンスが作成されます。スレッドと関連させないかどうかを理解し、整理されたコールバックを調べるのに役立ちます。 – Moo3

+0

downloadThumbはスレッド内で呼び出されません。また、データの到着時にコールバックを登録してプロミスオブジェクトを渡すだけで、ダウンロードが完了したときにコールバックを登録できます。 –

関連する問題