2014-04-02 52 views
0

我有我現在使用兩種方法,第一種是檢查一個網站,或根本沒有,通過檢查HTTP GET狀態代碼響應:如何檢查網站是否異步啓動?

checkifUp = (host, callback) -> 
    host = host.replace("http://", "").replace("/", "") 
    options = 
    host: "#{host}" 
    port: 80 
    path: "/" 

    req = http.get(options, (res) -> 
    callback(res.statusCode.toString()) 
    req.connection.destroy() 
) 

的Javascript:http://goo.gl/OyekSx

並與第二個,我做的是從網站我有一個數組選擇隨機網站和驗證(與第一種方法的幫助下),如果這樣的網站了。如果是這樣,我想返回該網站作爲父方法的返回值(在本例中是第二個),但如果不是,我想重新運行該方法,直到它找到數組中的在線網站。這是我迄今所做的:

siteSet = -> 
    site_urls = ["sub1.mysite.com", "sub2.mysite.com", "sub3.mysite.com", "sub4.mysite.com", "sub5.mysite.com"] 
    random_site = site_urls[Math.floor(Math.random()*site_urls.length)] 

    checkifUp "#{random_site}", (code) -> 
    if code isnt "200" 
     siteSet() 
    else 
     selected_site = random_site 
    selected_site 

的Javascript:http://goo.gl/ydmSiV

顯然,這不工作的方式我想:如果狀態代碼不是200,那麼它確實重新運行該方法,(到目前爲止,我們沒事);但問題出現在網站確實在線時,因爲我不知道如何返回selected_site變量(在checkifUp調用中聲明)作爲父方法的返回值(在這種情況下爲siteSet() )。我需要這樣做,以便能夠使用siteSet()返回值作爲另一個函數的變量:

otherFunc = -> 
    theSite = siteSet() 
    console.log(theSite) 

的Javascript:http://goo.gl/cmsryJ

而且有信心它總是會被放置在這個內的在線網站URL(字符串)otherFunc()

我有兩個問題一下:

  1. 我怎麼能做到我想做的事嗎? (杜,一個很明顯嘿嘿)

  2. 我不太清楚這一點,但據我瞭解 的JavaScript/CoffeeScript中,當siteSet()會從內 otherFunc稱爲() ,(至少在這個「setup」中),otherFunc()不會等到siteSet()返回一個String(這是我想要的結果) 我是正確的嗎?即使有回報的問題解決了,我認爲是 將要發生的是,當我打電話siteSet()otherFunc()內將使用精確的結果從調用,這意味着如果當siteSet( )被拼命地跑,返回另一個呼叫 本身(因爲random_site選擇不在線)內otherFunc的 「theSite」變量()將採取裸()函數 的價值,我是不是正確的? (如果是這樣的話),如何解決這個 其他問題?我想設置 otherFunc()裏面的「theSite」變量,直到這樣的值是一個字符串,因爲我需要它。

在此先感謝您的幫助。

+0

你試過把回調傳遞給siteSet,和checkifUp一樣嗎?這就是異步混亂如何處理現在heh :) – ezakto

+0

你有3個迴應,請投票選擇更好的一個,或者如果你覺得沒有得到很好的迴應,請修復你的問題......謝謝.. – user1050817

回答

1

這裏的問題是不是你」重新採取同步方法爲您的其他功能,而不是異步,讓我們來看看這個:

//sorry I prefer use plain js, I'm pretty sure than you will be able to understand the code 
    var funA = function(){ 
    //long computation here 
    console.log("calling from funA"); 

    } 

var funB = function(){ 
    var resultA = funA(); 
    console.log("resultA is " + resultA); 
    console.log("calling from funB"); 

    } 

    funB() 

結果會是這樣的:

 resultA is undefined 
    calling from funB 
    calling from funA 

你的代碼會翻譯成這樣:

//sorry I'm not so familiar with coffeescript so maybe I would do a little mistake 
    siteSet = (callback)-> 
    site_urls = ["sub1.mysite.com", "sub2.mysite.com", "sub3.mysite.com",   "sub4.mysite.com", "sub5.mysite.com"] 
    random_site = site_urls[Math.floor(Math.random()*site_urls.length)] 

    checkifUp "#{random_site}", (code) -> 
     if code isnt "200" 
     siteSet() 
     else 
     selected_site = random_site 

     callback(selected_site) 


    otherFunc = -> 
     siteSet((result)-> console.log(result)) //(result)-> console.log(result) is your 
              //callback, so inside checkifUp you will call it and pass selected_site 
              // 

爲更好地理解爲什麼執行的NodeJS這樣的代碼檢查這些物品.. 。

http://docs.nodejitsu.com/articles/getting-started/control-flow/what-are-callbacks

http://dreamerslab.com/blog/en/javascript-callbacks/

x = LONGIO() 
    console.log(x) 

    vs 

    LONGIO((resultOfLongIO)-> console.log(resultOfLongIO)) 

基本上在異步代碼的想法(沒有承諾,發電機,單子或其他)比你通過泛函給回調的結果...這是所有...

0

我不知道CoffeeScript,所以我使用JavaScript轉換爲您的兩個功能。如果CoffeeScript中存在我不知道的特質,請告訴我。

也就是說,它看起來像你正在使用異步功能,siteSet,並試圖同步返回一個值。您可以查看this question的解決方案以獲取更多信息。您有有效的返回值的兩個選項:

  • 活動
  • 回調

你有你的第一個功能,checkIfUp回調,所以我的建議是使用一個siteSet爲好。你可以調用如下:

otherFunc = -> 
    theSite = siteSet (theSite) -> 
    console.log(theSite) 

至少,我認爲這是CoffeeScript語法。在JavaScript它肯定:

otherFunc() 
{ 
    theSite = siteSet(function(theSite) 
    { 
    console.log(theSite); 
    }); 
} 
0

添加回調siteSet就像你與checkifUp做:

siteSet = (callback) -> 
    site_urls = ["sub1.mysite.com", "sub2.mysite.com", "sub3.mysite.com", "sub4.mysite.com", "sub5.mysite.com"] 
    random_site = site_urls[Math.floor(Math.random()*site_urls.length)] 

    checkifUp "#{random_site}", (code) -> 
    if code isnt "200" 
     siteSet() 
    else 
     callback(random_site) 

然後,你可以這樣做:

otherFunc = -> 
    siteSet (theSite) -> 
    console.log theSite