Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将变量分配给异步类方法的结果,该方法返回承诺中的对象?_Javascript_Promise_Axios - Fatal编程技术网

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操作符用于等待承诺。它只能在异步函数中使用

示例来源于: 异步函数f1(){ var x=等待2秒后解析(10); console.log(x);//10 } f1(); 解决你的问题
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。谢谢,我将尝试,但我总是很难理解这种奇怪的语法(函数)()这给我带来了另一个问题-如果你不能从他们那里返回价值,为什么承诺会存在谢谢你花时间来帮助:)我用过,因为我在一些博客上发现了这一点,作者不敢解释返回价值的细微差别,现在应该更容易:)我不知道使用同步等待什么。我的问题是,我有一个承诺函数,它显然不能正确地返回值并将其赋值给变量,这就是问题所在