Node.js/express,javascript回调函数未执行

Node.js / express, javascript callback function not getting executed

本文关键字:回调 函数 执行 javascript js express Node      更新时间:2023-11-15

/* GET home page. */
router.get('/home/', function(req, res, next) {
  var code = req.query.code;
  req.SC.authorize(code, function(err, accessToken) {
    if ( err ) {
      throw err;
    } else {
      req.session.oauth_token = accessToken;
      // Client is now authorized and able to make API calls
      //res.render('home', { token: accessToken });
      var url = 'https://api.soundcloud.com/me?oauth_token=' + accessToken;
      requestify.get(url).then(function(response){
        var user = response.getBody();
        req.session.user = user;
        var user_url = config.base_url + '/api/users/add';
        var options = { user: user };
        requestify.post(user_url, options).then(function(response){
          console.log("done with users/add")
          var href = 'https://api.soundcloud.com/users/' + user.id 
              +  '/favorites?client_id=' + config.auth.client_id + '&linked_partitioning=1&limit=200';
          soundcloud.getCollection(req, res, [], href, function(collection){
            console.log("can't get here...");
            //console.log(collection);
            res.json(collection);
            //return collection;
          });
          /*
          var collection_url = config.base_url + '/api/collections/add';
          requestify.post(collection_url, options).then(function(response){
            console.log("done with collections/add")
            res.json(response);
          })
          */
        });
      });
    }
  });
});

function getCollection(req, res, collection, next_href, done){
    console.log("here");
    requestify.get(next_href).then(function(response){
        var updatedCollection = collection.concat(response.getBody().collection);
        if (next_href && updatedCollection.length < 500){ 
            var href = response.getBody().next_href;
            getCollection(req, res, updatedCollection, href);
        }
        else {
            console.log("done");
            done(updatedCollection);
        }
        //res.json(response.getBody());
    });
}

我看到的行为是,集合已经正确构建,console.log("done")显示在控制台中,但在我调用done(updatedCollection)后,我传入的回调函数不会执行。没有print语句,没有json呈现。你们明白问题出在哪里了吗?

您递归地调用getCollection函数而不进行回调,因此下次调用它时,done是未定义的。

将回调传递给递归调用以及

function getCollection(req, res, collection, next_href, done) {
    requestify.get(next_href).then(function(response){
        var updatedCollection = collection.concat(response.getBody().collection);
        if (next_href && updatedCollection.length < 500){ 
            var href = response.getBody().next_href;
            getCollection(req, res, updatedCollection, href, done); // <- HERE
        } else {
            console.log("done");
            done(updatedCollection);
        }
        //res.json(response.getBody());
    });
}