我需要从这个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);
});
}
答案 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处理程序。