【问题标题】:async.js and series issueasync.js 和系列问题
【发布时间】:2015-06-09 21:03:31
【问题描述】:

尝试在连接后运行 fetch。 Fetch 比 connect 快,并且在控制台中我收到 fetch 错误,因为它返回结果的速度比连接完成的速度快。但是在 async 系列的文档中是一个在第一次返回结果后运行第二个函数的工具。Settimeouts 可以节省情况,但它并不美观。在没有承诺的情况下,我怎么能等待?

var bets = [];
async.series([
    function(callback){
        setTimeout(function(){
            connect();
            callback(null, 'one');
        },1)
    },
    function(callback){
        setTimeout(function(){
            fetch_last_30();
            callback(null, 'two');
        },2000)
    }
]);

UPD 我的连接功能

function connect(){
    var url = "https://api....../login";
    /* connect to site and get access_token to access other api*/
    $.post(
        url,
        {username: "000", password : "000"},
        function(data){
            access_token = data["access_token"];
            console.log(data["access_token"]);
        }
    )
}

【问题讨论】:

    标签: javascript asynchronous synchronization async.js


    【解决方案1】:

    connect() 调用完成其异步工作之前,您无需调用回调。这是异步库可以完成其工作的唯一方式。由于connect() 是异步的,它本身可能有一个回调,您可以使用它来了解它何时实际完成。

    此外,如果您正确使用异步库,则根本不需要 setTimeout() 调用。

    从概念上讲,您希望connect() 函数在完成其异步操作时调用传入的回调:

    var bets = [];
    async.series([
        function(callback){
            connect(function() {
                callback(null, 'one');
            });
        },
        function(callback){
            fetch_last_30();
            callback(null, 'two');
        }
    ]);
    

    虽然我个人会在这里找到一个更好的解决方案来对两个操作进行排序,但您可以将您的 connect() 函数更改为:

    function connect(callback){
        var url = "https://api....../login";
        /* connect to site and get access_token to access other api*/
        $.post(
            url,
            {username: "000", password : "000"},
            function(data){
                access_token = data["access_token"];
                console.log(data["access_token"]);
                callback(data);
            }
        )
    }
    

    这是一个使用 Promise 代替异步库的版本:

    function connect(callback){
        var url = "https://api....../login";
        /* connect to site and get access_token to access other api*/
        return $.post(url, {username: "000", password : "000"}).then(function(data){
           access_token = data["access_token"];
           console.log(data["access_token"]);
           return data;
        });
    }
    
    connect().then(function(data) {
        fetch_last_30();
    });
    

    【讨论】:

    • 是的,我可以检测到连接回调,但不明白如何异步执行。循环while-if可能吗?
    • @user3003873 - 你能给connect() 函数一个回调,当它完成时被调用?您不能 while/if 在 Javascript 中等待异步操作完成。由于 Javascript 的单线程性质,这是行不通的。如需更多帮助,请公开connect()函数背后的代码。
    • 谢谢!我对js的理解变好了!
    猜你喜欢
    • 2015-03-29
    • 2016-02-18
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-05
    相关资源
    最近更新 更多