Javascript JS-使用回调时分配变量

Javascript JS-使用回调时分配变量,javascript,callback,Javascript,Callback,我对JS还比较陌生,并且已经在这个问题上停留了一段时间。我试图从函数的返回值分配一个变量,如下所示: var data = makeApiRequest(url); 但是,代码在makeApiRequest()函数完成之前继续,导致数据未定义 我研究这个问题已经有一段时间了,发现这个问题可以通过回调来解决。我的问题是,我不确定如何将数据分配给makeApiRequest()的结果 我发现这个例子(在callbackhell.com上)完美地说明了我的问题: var photo = downlo

我对JS还比较陌生,并且已经在这个问题上停留了一段时间。我试图从函数的返回值分配一个变量,如下所示:

var data = makeApiRequest(url);
但是,代码在makeApiRequest()函数完成之前继续,导致数据未定义

我研究这个问题已经有一段时间了,发现这个问题可以通过回调来解决。我的问题是,我不确定如何将数据分配给makeApiRequest()的结果

我发现这个例子(在callbackhell.com上)完美地说明了我的问题:

var photo = downloadPhoto('http://coolcats.com/cat.gif')
// photo is 'undefined'!
作者的解决方案:

downloadPhoto('http://coolcats.com/cat.gif', handlePhoto)

function handlePhoto (error, photo) {
  if (error) console.error('Download error!', error)
  else console.log('Download finished', photo)
}

console.log('Download started')

在这个例子中,photo是如何分配(甚至声明)的,这是我一生都无法理解的事情。我觉得如果我能解决这个问题,我就能解决我的具体问题。任何帮助都将不胜感激。非常感谢。

下载函数完成时,它调用回调函数
handlePhoto
,并将数据(
photo
)作为第二个参数传递给它,以便在
handlePhoto
函数中使用。

makeapirest(url)
是一个异步调用。这意味着,如果您在调用它之后立即尝试对其求值,它将是
未定义的
。现代的解决方案是使用一种新的方法

但是,如果逻辑不深入,回调函数是完全可以接受的。您可以通过如下方式更改
makeApiRequest
函数上的参数来执行此操作:

function makeApiRequest (url, callback) {
    // make the api call, and then:
    callback(results);
}
现在,您将调用
makeApiRequest()
,如下所示:

makeApiRequest (url, function(data) {
    // handle your data here.
    console.log(data);
});

如果您想分配承诺的返回值,那么可以将变量包装在异步函数中,稍后使用wait

**但是async等待是一个新的特性,不受广泛支持

因此,在您的例子中,假设makeapirest()返回一个承诺

  async function any(){ /* using async before function declartion*/

    var getValue = await makeApiRequest(); // using await 

    console.log(getValue); // returned value of makeApiRequest 
  }

可能复制我的坏,即使我搜索我仍然张贴了一个dup!“Asynchronous”可能是我在搜索中遗漏的词。但谢谢大家的回答。Matthewninja的解决方案对我来说非常有效,但我肯定会研究承诺。再次为dup的问题感到抱歉!