如何在不使用回调的情况下使用Soup.SessionAsync将页面加载到字符串中

时间:2013-06-26 20:55:14

标签: string webpage gjs

我做了一个漂亮的桌面,其中包括将网页从网址加载到像这样的变量

    let url = 'http://localhost/page.php';
let file = Gio.file_new_for_uri(url).load_contents(null);
let doc=(file[1]+"")
return doc;

这项工作非常适合localhost。问题是当我通过互联网访问某些内容时。每次循环访问此页面时,整个linux冻结1秒。所以我想使用异步方法。当然我不确定这是否会解决我的问题因为我不太确定它做了我认为它做的。但问题是我所有的例子都是回调,我很难理解...功能工作...但结果消失了我完成这个功能的那一刻..所以问题很简单: 有没有办法在getpage函数中返回mes变量?

getpage: function() {
  let url = 'http://localhost/page.php';
  let message = Soup.Message.new('GET', url)
_httpSession.queue_message(message, function(session, message) {
  let mes = message.response_body.data;
  });
  //like thie 
  return mes+"";
}, 

1 个答案:

答案 0 :(得分:0)

由于这是一种异步方法,您无法访问mes函数中的getpage变量。
以下是getpage函数的执行顺序:

  1. 创建Soup Message对象
  2. 在队列消息中注册该函数,但不要在结束时getpage函数执行该函数。
  3. 此时mes变量不存在
  4. 当下载url时,将执行队列消息中注册的函数并设置mes变量,但在getpage函数的另一个范围内。 这就是回调函数的异步函数的工作方式。

    所以我的建议是使用真正的回调函数并在其中进行治疗:

    getpage: function() {
      let url = 'http://localhost/page.php';
      let message = Soup.Message.new('GET', url)
      _httpSession.queue_message(message, real-callback);
    },
    
    real-callback: function(session, message) {
      let mes = message.response_body.data;
      /* do here what you wanted to do at the end of getpage fonction */
    }