2015-08-22 65 views
-1

我需要從這個JS返回數據。 console.log(...)在哪裏我需要從函數返回變量數據,我不想使用回調函數,我想使用諾言。從promise函數返回數據

function retrieveData(){ 
    urllib.request(facebookURL, function retrieveDataFacebook(err, data, res) { 
     if (err) { 
      throw err; 
     } 

     data = JSON.parse(data).shares; 
     console.log("Facebook: " + data); 
    }); 

    urllib.request(linkedInURL, function retrieveDataLinkedIn(err, data, res) { 
     if (err) { 
      throw err; 
     } 

     data = JSON.parse(data).count; 
     console.log("LinkedIn: " + data); 
    }); 
} 
+0

回調有什麼問題?即使你發佈的代碼在urllib.request中使用回調。 – Data

+0

沒什麼,但我不喜歡回調地獄。 –

+0

您有兩個並行運行的獨立異步請求,每個都有一些數據。你是否試圖從兩者中返回數據? – jfriend00

回答

0

您可以從呼叫者函數傳遞迴調函數。因爲這個函數是異步工作的,所以你不知道它何時會返回數據。代碼看起來像這樣。

function retrieveData(callback){ 
    urllib.request(facebookURL,callback); 
} 

和來電顯示是這樣的...

function getData(){ 
    retrieveData(function(err, data, res){ 
    // do something here 
    }) 
} 
0
// create one function to capture any url request 
function retrieveData(url, callback){ 

    urllib.request(url, function(err, data, res) { 
     if (err) throw err; 
     else callback(JSON.parse(data).shares); 
    }); 
} 

// callback 
function processData(data){ 
    //doSomething 
} 

// request url separately 
retrieveData(facebookURL, processData); 
retrieveData(linkedInURL, processData); 
0

下面是一個使用Bluebird promise library承諾版本,這有助於將異步功能與回調到承諾兼容功能:

var Promise = require('bluebird'); 
// make an promise version of urllib.request 
var urllib.requestAsync = Promise.promisify(urllib.request); 

function retrieveData(){ 
    var p1 = urllib.requestAsync(facebookURL).then(function(data) { 
     return JSON.parse(data).count; 
    }); 
    var p2 = urllib.requestAsync(linkedInURL).then(function(data) { 
     return JSON.parse(data).count; 
    }); 
    return Promise.all([p1, p2]); 
} 

retrieveData().spread(function(d1, d2) { 
    // process your data here 
}, function(err) { 
    // some error here 
}); 

你也應該知道,從異步回調中做throw將會我不會向你的更高層面投擲。您將無法看到異常,因爲此時異常會進入創建異步響應的node.js後端,而不是您的代碼。承諾使異步錯誤處理更簡單得多,因爲它們會將異常或拒絕承諾傳播回您的承諾處理程序。

+0

http://www.html5rocks.com/en/tutorials/es6/promises/ – Data

+0

@Data - 通過發佈該鏈接,您的預期信息是什麼? ES6承諾沒有我在這裏使用的'.promisify()'方法。 – jfriend00