从promise函数返回数据

时间:2015-08-22 19:01:14

标签: javascript node.js express

我需要从这个JS返回数据。 console.log(...)在哪里我需要从函数返回数据到变量,我不想使用calback,我想使用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);
    });
}

3 个答案:

答案 0 :(得分:0)

您可以从调用者函数传递回调函数。因为此函数异步工作,所以您不知道何时将返回数据。代码看起来像这样。

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

和这样的来电者......

 function getData(){
  retrieveData(function(err, data, res){
     // do something here 
  }) 
 }

答案 1 :(得分: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);

答案 2 :(得分: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后端,而不会进入您的代码。 Promise使这种异步错误处理简单得多,因为它们将异常或拒绝的promise传播回你的promise处理程序。