This question already has answers here:
How do I return the response from an asynchronous call?

(42个答案)


4年前关闭。




我将500px API模块与Node.js结合使用,并且试图获取特定用户的照片。我遇到函数,回调和作用域的问题...我有以下代码:

api500px.photos.getByUsername('username',{'sort':'created_at','image_size':'3'},function(error,results){
如果(错误){
console.log(错误);
返回;
}
var dataPx = results.photos;
});

我想找出我的变量dataPx并在我的ejs模板中使用它:

app.get('/ materialize',function(req,res){
res.render('materialize.ejs',{dataPx:dataPx});
});

如果有人可以解释我该怎么做以及这种事情在JavaScript中是如何工作的,那将很酷!

谢谢

最佳答案

我不知道您的应用程序结构如何,但以下是“第一简单”解决方案:

app.get('/materialize', function(req, res) {
    api500px.photos.getByUsername ('username', {'sort': 'created_at', 'image_size': '3'}, function(error, results) {
        if (error) {
            console.log(error);
            return;
        }
        var dataPx = results.photos;
        res.render('materialize.ejs', {dataPx: dataPx});
    });
  });

采用更好,更清洁的方法,请使用q library

api500px.photos.getByUsername包装为一个 promise :
function getUserPhotosAsync() {
  var deferred = q.defer();
      api500px.photos.getByUsername ('username', {'sort': 'created_at', 'image_size': '3'}, function(error, results) {
            if (error) {
                deferred.reject(error);
            }
            deferred.resolve(results.photos);
        });
  return deferred.promise;
}

并将其用作:
   app.get('/materialize', function(req, res) {
      getUserPhotosAsync().then(function(dataPx) { //looks cool isn't it?
        res.render('materialize.ejs', {dataPx: dataPx});
      });
    });

快乐的帮助!

关于javascript - 返回回调函数Node.js的数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35794070/

10-11 05:28