2015-04-05 70 views
0

嘗試在連接後運行提取。取指比連接快,並且在控制檯中,我得到了取指錯誤,因爲它返回的結果比連接完成得快。但是在async系列文檔中,第一個返回結果後是運行第二個函數的工具.Settimeouts節省了情況,但它並不美觀。如果一切都沒有承諾,我該如何等待?async.js和系列問題

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

回答

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

這裏有一個版本使用承諾s而不是異步庫:

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

是的,我可以檢測連接回調,但無法理解如何在異步中完成它。週期 - 如果可能? – user3003873 2015-04-05 06:51:27

+0

@ user3003873 - 你可以給connect()函數一個回調函數,它在完成時調用嗎?如果在Javascript中等待異步操作完成,則無法執行。由於Javascript的單線程性質,這是行不通的。如果您需要更多幫助,請將'connect()'函數後面的代碼公開。 – jfriend00 2015-04-05 06:53:54

+0

在upd部分。 – user3003873 2015-04-05 07:00:54