首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步Soup调用

异步Soup调用
EN

Stack Overflow用户
提问于 2020-02-13 19:05:34
回答 1查看 195关注 0票数 2

我正在为Gnome做简单的扩展,在异步Soup调用和事件循环方面有一些问题。

我现在拥有的是:

代码语言:javascript
复制
_httpSession = new Soup.Session();

let token = 'sometoken'
let url = 'someurl';
let _allData = [];
let elements = [1,2];

for (let el of elements) {
    let message = Soup.form_request_new_from_hash('GET', url + el, { access_token: token });
    _httpSession.queue_message(message, () => {
        if (message.status_code != Soup.KnownStatusCode.OK) {
            _error(message.status_code.toString());
        }
        try {
            message = JSON.parse(message.response_body.data).items;
        } catch (e) {
            _error(e.toString());
        }
        _allData = _allData.concat([el, message]);
    });
}

考虑到上面for循环中的异步调用,如何确保_allData.concat()已经为所有迭代执行了?我希望打印出_allData变量,但只在每个el的连接被执行时。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-13 21:14:44

最简单的方法可能是异步等待模式:

代码语言:javascript
复制
// Your request function can be turned into a Promise:
function requestFunc(session, message) {
    return new Promise((resolve, reject) => {
        session.queue_message(message, () => {
            try {
                if (message.status_code === Soup.KnownStatusCode.OK) {
                    let result = JSON.parse(message.response_body.data);

                    resolve(result);
                } else {
                    reject(new Error(message.status_code.toString()));
                }
            } catch (e) {
                reject(e);
            }
        });
    });
}

// Then you can await each in a loop
async function logRequestResults(session, url, token, elements) {
    try {
        let results = [];

        for (let el of elements) {
            let message = Soup.form_request_new_from_hash('GET', url + el, {
                access_token: token
            });

            let result = await requestFunc(session, message);

            results = results.concat([el, results.items]);
        }

        // Success; all requests completed
        log(results);
    } catch (e) {
        // An error occurred somewhere in the loop
        logError(e);
    }
}

// Using the function
_httpSession = new Soup.Session();

let token = 'sometoken'
let url = 'someurl';
let elements = [1,2];

logRequestResults(session, url, token, elements);

根据您实际对结果所做的操作,您可能需要重构它。重要的部分是将func(something, () => {})模式转换为循环中可以awaitPromise

还要注意的是,async函数隐式返回一个Promise,那些也可以与await一起使用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60214850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档