Javascript 返回函数的函数中的值
以下代码段返回Javascript 返回函数的函数中的值,javascript,node.js,Javascript,Node.js,以下代码段返回未定义的,而不是预期的链接数组。apiCall()来自 是否可以返回数组?如果是,怎么做?如果不是,为什么 async function fetchData() { await apiCall('https://www.googleapis.com/youtube/v3/search?q=leeroyjenkins&maxResults=4&part=snippet&key={KEY}', (error, response, body
未定义的,而不是预期的链接数组。apiCall()来自
是否可以返回数组?如果是,怎么做?如果不是,为什么
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) })
};
有人能指出原因吗?wait
用于等待承诺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))
})
});
}
wait
用于等待承诺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))
})
});
}
更改:
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() {
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))
若否,原因为何apiCall
不返回承诺,不是吗?此函数返回的不是aync,它不返回承诺,更仔细的分析表明映射值返回,这不是承诺接口。如果I console.logfetchData()
,它会输出承诺{}@Remario@FederkunIf不是为什么?-apiCall
不返回承诺,不是吗?此函数返回的不是aync,它不返回承诺,更仔细的分析表明映射值返回,这不是承诺接口。如果I console.logfetchData()
,它会在r do上输出承诺{}@Remario@Federkunthen,JSON.parse(r).items.map(i=>''+i.id.videoId)然后在rdo上,JSON.parse(r.items.map(i=>''+i.id.videoId)使用async和await应该可以消除对明确承诺的需求,这是一个很好的解决方案,但它违背了aync/Wait的概念。你的意思是什么?async/await是建立在生成器和承诺之上的:没有承诺你就不能使用它们。因为apiCall
is不返回承诺,你必须“承诺”it.question,如果您显式使用承诺,为什么要用异步等待它,当您重新解决它时,捕获的是什么,这是多余的,对吧。删除async和await关键字应该不会产生任何区别。是的,在这个特定的示例中,async
/await
没有任何用途。然而,问题是“为什么我的代码返回未定义的”,希望OP现在知道原因。如果你想用“你的fetchData可能只会返回一个承诺”来改进你的答案欢迎您这样做。我认为这将帮助Nothiness更好地理解他真正想要用他的获取数据。使用async和await应该消除对明确承诺的需要,这是一个好的解决方案,但它违背了aync/Wait的概念。您的意思是什么?async/await构建在生成器和承诺之上:您在没有承诺的情况下不能使用它们。因为apiCall
不会返回承诺,所以您必须“承诺”it.question,如果您显式使用承诺,为什么要用异步等待它,当您重新解决它时,捕获的是什么,这是多余的,对吧。删除async和await关键字应该不会产生任何区别。是的,在这个特定的示例中,async
/await
没有任何用途。然而,问题是“为什么我的代码返回未定义的”,希望OP现在知道了原因。如果你想用“你的fetchData可能只会返回一个承诺”来改进你的答案,欢迎你这么做。我认为这将有助于Nothiness更好地理解他真正想用他的fetchData
完成什么。