2017-06-26 9 views
2

私は変数に約束返された値を割り当てようとしていますが、割り当てていません。私はconsole.log(this.imageref1)の時でもまだ空文字列を取得しています。 ここでの目的は、firebaseに写真をアップロードした後に返されるdata.downloadURLを取得することです。私はダウンロードしたURLが必要です。イメージパスのために私のデータベースにそれを保存する。私はここで立ち往生しています、私のデータベースは、downloadURLの空のデータを取得します。プロミスの返品データをクラス変数に割り当てることはできませんか?

post_news(form: NgForm){ 

    this.title = form.value.title; 
    this.content = form.value.content; 
    this.category = form.value.category; 


    console.log(this.capturedimage1); 


    if(this.capturedimage1 !== ''){ 

     //console.log('captured image is not empty'); 



    let storageRef = firebase.storage().ref(); 

    const filename = Math.floor(Date.now()/1000); 

    const imageRef = storageRef.child(`images/${filename}.jpg`); 

    let uploaded_file_path = `images/${filename}.jpg`;  


    imageRef.putString(this.capturedimage1, firebase.storage.StringFormat.DATA_URL).then(data=>{ 

     this.imageref1 = data.downloadURL; 

    }); 


    } 
} 

答えて

1

だから、その値が設定されつつある - 最終的に。おそらく、囲み機能が実行された後に起こっているという事実と闘っているかもしれません。その後、

function test(x) { 
    x.a = 1; 
    Promise.resolve(true).then(_ => x.b = 2); 
    console.log(x); 
} 

操作、

> test({c: 3}) 
{ c: 3, a: 1 } 
undefined 

はまだそれにb: 2を持っていないオブジェクトを記録しますundefinedを返します。たとえば、ここでは本当に簡単なテストケースです。そのパラメータが最終的に、当然のことながら、設定されている:

> test(abc = {c: 3}) 
{ c: 3, a: 1 } 
undefined 
> abc 
{ c: 3, a: 1, b: 2 } 

本当に何が起こっているかを理解するには、すべてのJSが内で発生することを理解する必要がある「イベントループ。」 JavaScriptでは、一度に1つのことしか実行できないため、他のイベントのスケジュールを設定するときには、JSは「この関数のすべてを最初に実行し、次に実行する予定のものを見つけます」というルールに従わなければなりません。

いくつかの関数呼び出しが同期が起こる、彼らが完了するまで、彼らは前進してから関数呼び出しをブロック。たとえば、[1,2,3].forEach(x => console.log('hello, ' + x))は、完了する前に3つの文字列をコンソールに記録します。しかし、の全ポイントは、という値は、コンピュータがそれを見つけ出すのに忙しくて、それはまだ利用できないということです。したがって、あなただけ実際にそれが出た、と.then()または.catch()にリスナーを追加するなど、約束のあなたの操作のすべてだ後、値を使用し非同期を非ブロックされていることができます。現在の関数が完了し、これらのコールバックがイベントループに置かれ、約束された計算が完了したときに発生します。

+0

thxxはあなたの回答のバディ! ..関数の流れをブロックしないでください。?(関数が関数全体の流れになるようにするには、この全体を設定する必要があります 'imageRef.putString(this.capturedimage1、firebase.storage。 StringFormat.DATA_URL).then(data => {that.imageref1 = data.downloadURL;}); '関数に? – Mikethetechy

+0

@Mikethetechy:あなたは*非同期から同期に移行できません。ランタイムは、「私はこれでやめようとはしていません」と言っています。それを騙す方法はありません。「いいえ、実際はこれでやめようとしています。約束が定義されている関数の中にまだいる場合、そのコールバック*はまだ起動されていません*と*は起動しません*:後でスケジュールされます。プログラム全体を非同期的に考える必要があります。もしその一部が分かっているなら、あなたが知っている前にそれをしようとするよりも、この値を知っているときに起こる '.then()'コールバックにデータベース挿入 - 。 –

+0

あなたの返信のためのthx ...今私はどのように非同期関数が動作するかを知っています。私がデータベースの挿入を行う唯一の方法は.then()コールバックです。しかし、私はそれらをアップロードした後の画像のリストを持っています。私はダウンロードURLをデータベースに保存するためにダウンロードURLを取得する必要があります....そのかなり挑戦的です...私はまだダウンロードURLを取得する必要があります。 – Mikethetechy

1
var that = this; 
imageRef.putString(this.capturedimage1, firebase.storage.StringFormat.DATA_URL) 
.then(data=>{  
    that.imageref1 = data.downloadURL; 
    return Promise.resolve(data.downloadURL); 
}) 
.then(function(url){ 
    //make the db call. 
}); 
+0

urの答えは...そういうわけで、私はこのようにsmthngできます:var tmp_url = ''; imageRef.putString(this.capturedimage1、firebase.storage.StringFormat.DATA_URL).then(データ=> {tmp_url = data.downloadURL;}); this.imageref1 = tmp_url? – Mikethetechy

+0

@ cr-drostが指摘された場合、部分実行はaysncで行われます。 thenブロック内のコードは後で実行される可能性があります。この場合、this.imageref1 = tmp_urlはthenブロックの前に実行される可能性があるため、期待した結果が得られない可能性があります。 – gvmani

+0

私はそれを同期させる方法がないので? – Mikethetechy

関連する問題