2016-04-29 60 views
0

我有兩個函數,一個在另一個裏面運行,另一個在使用fisrt的輸出(列表)。按順序運行一個函數[Node JS]

我想要的是按順序運行。你能幫忙嗎?

gm_scrape.search_link(request, function(list){ 
    gm_scrape.fetch_profiles(list, function(profiles, request){ 
     console.log("the profil is "+profiles); 
    }); 
}); 

感謝您的幫助!

+0

這些按順序運行。首先'gm_scrape.search_link()'運行,然後當它完成時,它調用它的回調,然後在該回調中運行'gm_scrape.fetch_profiles()'。你有什麼確切的問題需要你的幫助? – jfriend00

回答

0

一個更好的辦法是使用承諾

gm_scrape.search_link(request).then(function(list){ 

    return gm_scrape.fetch_profiles(list); 

}).then(function(profiles){ 

    console.log("the profil is "+profiles); 

}).catch(function(err){ console.warn(err); }); 

gm_scrape.search_link = function(request){ 
    return new Promise(function(resolve, reject){ 
     // async call... 
     .onsuccess: resolve(list) 
     .onfailure: reject(err) 

    }) 
} 

gm_scrape.fetch_profiles = function(list){ 
    return new Promise(function(resolve, reject){ 
     // async call... 
     .onsuccess: resolve(profiles) 
     .onfailure: reject(err) 

    }) 
} 

對不起,我是那種縮寫的可讀性。這是一個承諾與Ajax調用

gm_scrape.search_link = function(req){ 
    return new Promise(function(resolve, reject){ 
     $http({ 
      method: 'POST', 
      url: req.url, 
      data: req.data 
     }).success(function successCallback(list) { 
      console.log(list); 
      resolve(list); 
     }).error(function(error) { 
      console.log(error); 
      reject(error); 
     }); 
    }) 
} 
+0

我只是打字「使用承諾」很好的答案! –

+0

謝謝,我得到了這個錯誤.onsuccess:resolve(list) ^ SyntaxError:意外的標記。 –

+0

我縮寫了一些東西,因爲Promises可以用來解析(返回)任何異步調用的結果,如db查詢或者其他東西 –

0

當你在你的問題提供(由jfriend00評論所暗示的)的例子在序列正在運行的例子。如果你試圖避免「死亡金字塔」的承諾是一個很好的方式來做到這一點,正如「史蒂文卡斯帕爾」所建議的那樣。

然而,還有其他常見的方法來做同樣的事情。其中一個其他常見的方法來解決,這是使用caolan/async's瀑布方法:

async.waterfall([ 
    function(callback) { 
    gm_scrape.search_link(request, function(list){ 
     callback(null, list); 
    }); 
    }, 
    function(callback) { 
    gm_scrape.fetch_profiles(list, function(profiles, request){ 
     callback(null, profiles); 
    }); 
    } 
], function(err, result) { 
    console.log("the profile is ", result); 
}); 

然而,如果這可能沒有什麼意義,除非你有嵌入式3-4回調。總體而言,Promise可能是一個更好的設計模式,因爲此解決方案更適合現有的代碼庫,沒有承諾,您需要一種方法來組織依賴於最後一個結果的一系列長任務,其中回調將是混亂的,很難管理。如果你的模塊沒有可用的承諾,並且你不想花費時間來封裝它(因爲這些回調中斷會促使大多數承諾模塊提供幫助器),這也可能是一個更簡單的解決方案。

+0

thanks !,但是我有這個問題:SyntaxError:missing)在第89行參數列表之後 –

+0

對不起我做了一個錯誤的複製和粘貼,我也無法測試,因爲我不知道'gm_scrape'方法的作用。 – tsturzl