async.js和系列问题

async.js and series issue

本文关键字:问题 系列 js async      更新时间:2023-09-26

尝试在连接后运行fetch。Fetch比connect快,在控制台中我会收到Fetch错误,因为它返回结果的速度比连接完成的速度快。但在异步系列的文档中,有一个工具可以在第一个函数返回结果后运行第二个函数。解决方案可以挽救局面,但并不美观。当一切都没有承诺时,我该如何等待?

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"]);
        }
    )
}

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();
});