Javascript 如何将变量分配给异步类方法的结果,该方法返回承诺中的对象?
看起来互联网上没有人描述过类似的问题,类似的解决方案对我不起作用。 我正在尝试刮取网页,所以我为解析器创建了一个类,其中一个方法如下所示:Javascript 如何将变量分配给异步类方法的结果,该方法返回承诺中的对象?,javascript,promise,axios,Javascript,Promise,Axios,看起来互联网上没有人描述过类似的问题,类似的解决方案对我不起作用。 我正在尝试刮取网页,所以我为解析器创建了一个类,其中一个方法如下所示: get chListUrl() { return "http://www.teleman.pl/program-tv/stacje"; } getChannels() { var dict = {}; axios.get(this.chListUrl).then(function (response)
get chListUrl() {
return "http://www.teleman.pl/program-tv/stacje";
}
getChannels() {
var dict = {};
axios.get(this.chListUrl).then(function (response) {
var $ = cheerio.load(response.data);
var ile_jest_stacji = $('#stations-index a').length;
$('#stations-index a').each( (i,elem) => {
let href = $(elem).attr('href');
let kodstacji = href.replace(/\/program-tv\/stacje\//ig,'');
let nazwastacji = $(elem).text();
dict[nazwastacji]=kodstacji;
});
return dict;
}).catch(function (error) {
console.log(error);
return null;
}).finally(function() {
console.log("Koniec");
});
}
问题是getChannels
必须是间接异步的,因为它包含axios,但
let tm = new TM();
var a = tm.getChannels();
a总是未定义的,应该是字典!这种构造意味着“将执行tm.getChannels()的结果分配给变量”,所以赋值应该始终在整个函数结束后进行。否则,这种语言中的语法是无用的,因为您永远无法确定变量中存储了什么值,并且很难找到和调试这种错误
var a = await tm.getChannels();
不工作->SyntaxError:await仅在异步函数中有效(嗯?)
将异步添加到GetChannel()不会改变任何内容。将异步分配给getChannels()并从分配中删除'await',将返回承诺{undefined}(huh?)
将async置于axios之前不会改变任何内容,因为响应已由.then()处理。
将
return dict
更改为return await dict
会给出另一个“await仅在异步函数中有效”(哈?axios是异步的)
这两个星期我都在为之挠头。
在Swift中,当某个内容在完成处理程序中返回时,它会在适当的时间分配给变量,为什么Promise返回的内容的工作方式不同?您需要在异步函数中使用: wait操作符用于等待承诺。它只能在异步函数中使用
class-TM{
获取chListUrl(){
返回“http://www.teleman.pl/program-tv/stacje";
}
异步getChannels(){//您不需要使用get语法
设dict={};
try{//我们将使用try-catch而不是reject来处理可能的错误
const response=wait axios.get(this.chListUrl);
让$=cheerio.load(response.data);
设ile_jest_stacji=$(“#站点索引a”)。长度;
$(“#站点索引a”)。每个((i,elem)=>{
让href=$(elem.attr('href');
让kodstacji=href.replace(/\/program tv\/stacje\//ig,”);
让nazwastacji=$(elem.text();
dict[nazwastacji]=柯达斯塔基;
});
返回命令;
}捕获(ex){
控制台日志(ex);
返回空
}
}
}
//让我们努力吧!
(异步函数(){
const tm=新tm()
const channels=wait tm.getChannels()
//用频道做任何你想做的事
控制台日志(通道)
})()
现在,您可能不会像这样不知从何处调用
getChannels
,相反,您可能会在自己定义的函数中,您需要向该函数添加async
关键字。代码所在的任何块函数都需要是async
如果要使用async/await语法,则应删除。然后()语法,您可以通过以下方式解决:
async getChannels() {
const response = await axios.get(this.chListUrl);
return response
}
您可以在链接中了解有关async/await的更多信息:这是否回答了您的问题<代码>这种构造意味着“将执行tm.getChannels()的结果分配给变量”,因此赋值应始终在整个函数结束后完成。-它在整个函数结束后完成。您的
getChannels()
函数不会立即执行传递给的函数。然后(…)
。您将此函数作为对承诺的回调—您告诉解释器,“在请求完成时运行此代码”,解释器保存代码,然后返回而不运行它。Axios是GetChannel中的内部函数。GetChannel不返回任何承诺,它应该返回字典,因此如果我理解正确,承诺在JavaScript中是无用的,如果它们不能返回值:(,这真是一个悲哀的故事。它们可以返回值。它们可以异步返回值,但不能同步返回。这绝非无用。这意味着您可以在等待HTTP请求完成的同时继续执行代码。这意味着您可以同时启动多个HTTP请求。您只需围绕这一新模式调整代码即可n-getChannels()
依赖于HTTP请求,因此它无法直接返回字典,您必须给它一个回调或让它返回一个承诺。这是异步javascript。谢谢,我将尝试,但我总是很难理解这种奇怪的语法(函数)()这给我带来了另一个问题-如果你不能从他们那里返回价值,为什么承诺会存在谢谢你花时间来帮助:)我用过,因为我在一些博客上发现了这一点,作者不敢解释返回价值的细微差别,现在应该更容易:)我不知道使用同步等待什么。我的问题是,我有一个承诺函数,它显然不能正确地返回值并将其赋值给变量,这就是问题所在