2017-08-26 159 views
1

以下片段返回undefined而不是預期的鏈接數組。 apiCall()來自here在函數的函數中返回值

是否有可能返回數組?如果是這樣如何?如果不是爲什麼?

async function fetchData() { 

    await apiCall('https://www.googleapis.com/youtube/v3/search?q=leeroyjenkins&maxResults=4&part=snippet&key={KEY}', 
     (error, response, body) => { 
     return JSON.parse(body).items.map(i => 'https://www.youtube.com/watch?v=' + i.id.videoId) 

      }) 

} 
    fetchData().then(r => console.log(r)) 

編輯:下面的代碼似乎工作;

async function fetchData(param, fn) { 

    await apiCall('https://www.googleapis.com/youtube/v3/search?q=leeroyjenkins&maxResults=4&part=snippet&key={KEY}', 
     (error, response, body) => { 
     fn(JSON.parse(body).items.map(i => 'https://www.youtube.com/watch?v=' + i.id.videoId)) 

      }) 

} 
fetchData('lee', function(Ar) { console.log(Ar) }) 

}; 

有人能指出爲什麼嗎?

+0

_如果不是爲什麼?_ - 'apiCall'不返回一個承諾,不是嗎? – Federkun

+0

這個函數返回的不是異步的,它沒有返回promise, – Remario

+0

更近的分析表明一個maped值返回,這不是promise界面。 – Remario

回答

0

await用於等待無極apiCall不是其中之一,它使用了延續傳遞風格約定。所以,你只需要解決一個新的承諾,當apiCall的回調被稱爲:

async function fetchData() { 
    return await new Promise((resolve) => { 
     apiCall('https://www.googleapis.com/youtube/v3/search?q=leeroyjenkins&maxResults=4&part=snippet&key={KEY}', (error, response, body) => { 
      // resolve the promise here 
      resolve(JSON.parse(body).items.map(i => 'https://www.youtube.com/watch?v=' + i.id.videoId)) 
     }) 
    }); 
} 
+0

使用異步和await應該消除明確的承諾的需要,很好的解決方案,但它藐視異步/等待的概念 – Remario

+0

什麼你的意思是?異步/等待是建立在生成器和承諾之上的:你不能在沒有承諾的情況下使用它們。由於'apiCall'不是返回一個承諾,你必須「promisify」它。 – Federkun

+0

問題,如果你明確地使用承諾,爲什麼等待它與異步,當你解決它,什麼是抓住,這是多餘的權利。刪除異步和等待關鍵字應該沒有區別。 – Remario

0

變化:

async function fetchData() { 

    await apiCall('https://www.googleapis.com/youtube/v3/search?q=leeroyjenkins&maxResults=4&part=snippet&key={KEY}', 
     (error, response, body) => { 
     return JSON.parse(body).items.map(i => 'https://www.youtube.com/watch?v=' + i.id.videoId) 

      }) 

} 

到:

async function fetchData() { 

    return await apiCall('https://www.googleapis.com/youtube/v3/search?q=leeroyjenkins&maxResults=4&part=snippet&key={KEY}'); 

} 

試承諾執行此:

fetchData().then(r => console.log(r)) 
+0

然後在r上執行,JSON.parse(r).items.map(i =>'https://www.youtube.com/watch?v='+ i.id.videoId) – Remario