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.log
fetchData()
,它会输出承诺{}@Remario@FederkunIf不是为什么?-
apiCall
不返回承诺,不是吗?此函数返回的不是aync,它不返回承诺,更仔细的分析表明映射值返回,这不是承诺接口。如果I console.log
fetchData()
,它会在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
完成什么。