2017-08-21 4 views
1

以下の機能がかかり、画像のURLから、ロードし、その幅と高さを返します。このコールバックをasync/awaitを使用して約束する方法を教えてください。

ready() { 
    console.log(getImageData(this.url)) 
} 

私はundefinedを得る:

function getImageData (url) { 
    const img = new Image() 
    img.addEventListener('load', function() { 
    return { width: this.naturalWidth, height: this.naturalHeight } 
    }) 
    img.src = url 
} 

問題は、私はこのような何かを行う場合、ありますこの関数は実行されていますが、画像がまだロードされていないためです。

await/asyncを使用して、写真が読み込まれ、幅と高さがすでに利用可能な場合にのみ値を返す方法を教えてください。

+0

Downvoteを行うことができます。 –

+0

@ try-catch-finally私は不明瞭なdownvoteの説明(あなたは "悪いタイトル"とは何ですか?そして、質問を改善するために編集を下ろすために。 – alex

+0

_あなたは最初に検索して試しませんでした。これは私が落としたものです。おそらく5分以上の間、検索エンジンやサイト検索機能を使用していないでしょう。 "getImageData()"はあなたが選んだ名前ですが、名前がとても一般的なので検索結果では役に立たないので、他の関数を表すかもしれません( "この関数を約束する方法はより良いタイトルになります。もちろんラメです)。あなたの質問は[X/Y](https://meta.stackexchange.com/questions/66377/)でした。非同期/待機中にasyncを返すことを実際に求めていました。約束で解決する。 –

答えて

6

async/awaitこのコールバック関数を約束する方法を教えてください。

あなたはありません。 As usual, you use the new Promise constructor。そのための構文的な砂糖はありません。写真が読み込まれており、幅と高さはすでに利用可能である唯一の値をログに記録するawait/asyncを使用する方法

function loadImage(url) { 
    return new Promise((resolve, reject) => { 
    const img = new Image(); 
    img.addEventListener('load',() => resolve(img)); 
    img.addEventListener('error', reject); // don't forget this one 
    img.src = url; 
    }); 
} 

あなたは答えの後に悪いタイトル(事前および事後編集)および編集のために

async function getImageData(url) { 
    const img = await loadImage(url); 
    return { width: img.naturalWidth, height: img.naturalHeight }; 
} 
async function ready() { 
    console.log(await getImageData(this.url)) 
} 
関連する問題