2015-08-22 64 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