2017-06-24 36 views
3

我正在使用fetch從api獲取數據json。工作正常,但我必須重複使用它的各種調用,因此它需要同步,否則我需要一些方法來更新接口時,每個組件的提取完成。如何使JavaScript提取同步?

function fetchOHLC(yUrl){ 
    fetch(yUrl) 
    .then(response => response.json()) 
    .then(function(response) { 
       alert(JSON.stringify(response.query)); 

      var t = response.created; 
      var o = response.open; 
      var h = response.high; 
      var l = response.low; 
      var c = response.close; 

     return {t,o,h,l,c}; 

    }) 
    .catch(function(error) { 
     console.log(error); 
    });  
} 

var fetchData = fetchOHLC(yUrl); 
alert(fetchData); // empty ? 

除了使用fetch之外,還有其他方法可以實現嗎? (我不想使用jquery)。

感謝

編輯

的問題是關於獲取的API,而不是AJAX,jQuery的沒有,那麼請停止將其標記爲那些重複的問題沒有正確閱讀它。如果您仍然不得不這樣做,請停止將其與十年前的問題和答案聯繫起來,十年內會發生很多變化。

+1

@Igor沒有,它的不同,試圖在將它們標記爲重複項之前正確地達到這兩個問題 –

+1

我看過這個問題,它是重複的。您不理解如何獲取/使用異步調用的結果,示例中的最後兩行非常明顯。仔細閱讀所提供的答案,以更好地瞭解如何使用來自異步調用的響應,這些答案寫得很好,可以幫助您解決問題。 – Igor

+1

@Igor請親切地閱讀jonas提供的關於這個問題的答案,看看他是如何理解這個問題並正確回答的:)我希望它能幫助你清除你的概念,並讓你理解ajax,fetch和jquery是不同的東西, –

回答

6

您希望您的取函數返回某事:

function fetchOHLC(yUrl){ 
    return fetch(yUrl) 
    .then(response => response.json()) 
    .then(function(response) { 
      alert(JSON.stringify(response.query)); 

     var t = response.created; 
     var o = response.open; 
     var h = response.high; 
     var l = response.low; 
     var c = response.close; 

    return {t,o,h,l,c}; 

    }) 
    .catch(function(error) { 
     console.log(error); 
    });  
} 

現在fetchData含有一種承諾,它可以輕鬆的使用:

var fetchData = fetchOHLC(yUrl); 
fetchData.then(alert); //not empty ! its {t,o,h,l,c} 

如果你想要一些奇特的ES7,你可以像這樣重寫整個事情:

async function fetchOHLC(yUrl){ 
    try{ 
    var r=JSON.parse(await fetch(yUrl)) 
    alert(JSON.stringify(r.query)); 
    return {t:r.created,o:r.open,h:r.high,l:r.low,c:r.close}; 
    }catch(e){console.log(e);} 
} 

(async function(){ 
    var fetchData = await fetchOHLC(yUrl); 
    alert(fetchData); 
})() 
+0

爲什麼我們使用return兩次? –

+0

好吧,對不起,我錯過了封閉回報返回只取不fetchOHLC –

+1

@NabeelKhan否它返回到承諾鏈。所以它解決了那個時候返回的諾言。這就是爲什麼我回復了這個承諾,所以你可以得到滿載的數據...... –