2017-11-29 16 views
2

私は2つのAPIを使用してウェブサイトを構築しています。バニラJavaScript ES6をAjaxが終了するまで待ちます

私のGoogleマップinitが応答を返すのを待つようにしています。

マイコード:

let Url = "https://ipinfo.io/json"; 
async function getInfo(url) { 
    const response = await fetch(url); 
    // console.log(response); 
    const data = await response.json(); 
    return data; 
} 
let ipInfo = getInfo(Url); 
console.log(ipInfo); 

//Google maps 
function initMap() { 
    var place = { 
    lat: -25.363, 
    lng: 131.044 
    }; 
    var map = new google.maps.Map(document.getElementById('map'), { 
    zoom: 4, 
    center: place 
    }); 
    var marker = new google.maps.Marker({ 
    position: place, 
    map: map 
    }); 
} 

今どのように私はinitMap()が終了する)(G​​ETINFO待つ作るのですか?私は

let ipInfo = getInfo(Url).then(function(){initMap()...Rest of code}); 

ような何かをしようとしていた。しかし、それはあなたがasyncawaitを使用しているので、あなたが行うことができるはず

+0

なぜ待ちますか?要求が行われている間にマップを初期化し、受信後に場所を更新します。 – charlietfl

+0

まったく同じことです。ここに来てからデータを送信するように指示するにはどうすればよいですか?私が別のことをすれば、それはちょうど未定義になるでしょう – alex3wielki

+0

initMapの内部でリクエストを作成し、地図オブジェクトに参照を保存します。また、ipinfoを使用して、ナビゲータを使用して現在の位置を取得するのと同じ精度ではない – charlietfl

答えて

2

を待ちませんでした:

let ipInfo = await getInfo(Url); 
// rest of code using ipInfo 

使用したい場合

getInfo(Url) 
    .then(info => { 
    initMap(); 
    // more code 
    }); 
の形式で Promise形式を使用してください。値を変数に返さないことが分かります。

これでうまくいかなかった場合は、何らかの構文エラーが発生している可能性が非常に高いです。非同期構造を見てみると

let Url = "https://ipinfo.io/json"; 
 
async function getInfo(url) { 
 
    const response = await fetch(url); 
 
    return response.json(); 
 
} 
 

 
(async function main() { 
 
let ipInfo = await getInfo(Url); 
 
console.log(ipInfo); 
 
})(); // make auto-running

let Url = "https://ipinfo.io/json"; 
 
async function getInfo(url) { 
 
    const response = await fetch(url); 
 
    return await response.json(); 
 
} 
 

 
getInfo(Url) 
 
    .then(ipInfo => console.log(ipInfo));

+0

それは奇妙です。私がしている原因です。 let ipInfo = getInfo(Url); console.log(ipInfo); console.logは 'Promise {:" pending "}'です。だから、それは待っているにもかかわらず実行している – alex3wielki

+0

また、それは約束を返しています。そして、もしconsole.logged関数の中で私はオブジェクトを取得しています(これは私が欲しいものです)。どのようにそれを修正するための任意のアイデア? – alex3wielki

+0

'ipInfo = getInfo(URL)を待ちます'をしてください。あなたが 'await'を持っていなければ、代わりにPromiseを返します。 (待つためには、最初の例のように関数をラップする必要があります)。私の例でいずれかのアプローチを使用することで、約束が価値に変わります。 – samanime

2

それだけで同じ機能でそれをすべて置くために意味をなさないと思いますように、それはそうです:

let Url = "https://ipinfo.io/json"; 

//Google maps 
async function initMap(url) { 
    const response = await fetch(url); 
    // console.log(response); 
    const data = await response.json(); 
    var place = { 
    lat: -25.363, 
    lng: 131.044 
    }; 
    var map = new google.maps.Map(document.getElementById('map'), { 
    zoom: 4, 
    center: place 
    }); 
    var marker = new google.maps.Marker({ 
    position: place, 
    map: map 
    }); 

    return map; 
} 

initMap(Url).then(map => { /* Do the rest of your stuff */ }) 

fまたはなぜ早く発射するのか、私はあなたが待っているものの両方が実際に約束または非同期の機能を返すことを確認するでしょう。

関連する問題