2017-01-04 71 views
0

我目前在then範圍之外訪問emoji_map時遇到問題,我不知道該怎麼做。如何訪問提取API響應之外的JSON對象?

這裏是我的代碼:

if (req) { 
    fetch(req).then(function(response) { 
     return response.json(); 
    }).then(function(response) { 
    /* start to observe */ 
    emoji_map = response.emoji_map; 
    console.log(emoji_map); 
    }); 

} 

當我做的console.log(emoji_map);外部如果循環我不能訪問分配的響應。誰能幫忙?

+0

製作確定你瞭解異步JavaScript,有許多文章和教程。 – wOxxOm

+0

在變量可用之前,您無法訪問變量,這恰好且僅在'then'範圍內。 –

回答

1

我建議您閱讀關於MDN上JavaScript詞法範圍和封閉的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures

function init() { 
    var name = "Mozilla"; // name is a local variable created by init 
    function displayName() { // displayName() is the inner function, a closure 
    alert(name); // use variable declared in the parent function  
    } 
    displayName();  
} 
init(); 

的init()創建了一個局部變量名,然後一個函數調用 顯示名()。 displayName()是一個內部函數,它在init()中定義爲 ,並且僅在該函數的主體中可用。 displayName()沒有自己的局部變量,但它有訪問外部函數變量的 ,因此可以使用在父函數中聲明的變量名稱 。

+0

這個問題與封閉無關。它必須在上下文訪問異步可用值之前處理。 –

+0

這個問題並不十分清楚。我認爲他的問題是變量是未定義的,甚至在承諾解決之後。 – Marco

+0

對。但是你怎麼知道這個承諾已經解決了,除非你是在你的代碼中的一部分('then'處理程序),根據定義,它已知已被解決? –

0

你能聲明一個全局變量中的抓取語句之外,並填寫該變量的反應,說你的情況

  var sampleData; 
      if (req) { 
      fetch(req).then(function(response) { 
       sampleData = response.json(); 
       return response.json(); 
      }).then(function(response) { 
       /* start to observe */ 
       emoji_map = sampleData.emoji_map; 
       console.log(emoji_map); 
      }); 

      } 

    OR 

     fetch('https://davidwalsh.name/some/url').then(function(response) { 
      return //... 
     }).then(function(returnedValue) { 
     // ... 
     }).catch(function(err) { 
      // Error :(
     }); 

你可以試試上面的代碼或參考this

+0

這不能理解異步性的基本原理。 –