【问题标题】:meteor callback heaven calling a callback after another callback流星回调天堂调用一个回调又一个回调
【发布时间】:2015-02-18 18:53:20
【问题描述】:

我已经设置了 3 个函数需要一个接一个地运行

我已经正确设置了我的回调,并且能够像这样在 functionOne 之后调用 functionTwo...

functionOne(functionTwo) // this is fine

如何在functionTwo之后调用functionThree?

我试过functionOne(functionTwo(functionThree)) 但这是错误的

我的代码

   var functionOneAsync = function(callback) {
     request.post('http://www.goodreads.com/oauth/access_token', {
     oauth: {consumer_key: 'somekey',
            consumer_secret: 'somesecretkey',
            token: oauthToken,
            token_secret: oauthTokenSecret}
  },
  function (error, response, body){
    if (!error && response.statusCode === 200) {
      var perm_data = querystring.parse(body)
      var accessToken = perm_data.oauth_token
      var tokenSecret = perm_data.oauth_token_secret
      console.log('exch done')
      return callback(null, accessToken, tokenSecret)
    }
    else {
      callback(error)
    }
  })
}
var functionOneAsyncSync = Meteor.wrapAsync(functionOneAsync);

var functionTwoAsync = function(error, accessToken, tokenSecret, callback) {
  request.get('https://www.goodreads.com/api/auth_user', {
    oauth: {consumer_key:'somekey',
            consumer_secret:'somesecretkey',
            token: accessToken,
            token_secret: tokenSecret
            }
  },
  function (error, response, body) {
    if (!error && response.statusCode === 200) {
      var options = {
        object: true,
        reversible: false,
        coerce: true,
        sanitize: true,
        trim: true,
        arrayNotation: false
      }
      var bodyToJson = parser.toJson(body, options)
      var goodreadsUserId = bodyToJson.GoodreadsResponse.user.id
      console.log('user id done' + goodreadsUserId)
      return callback(null, accessToken, tokenSecret, goodreadsUserId)
      }
    else {
      return callback(error)
    }
  })
}
var functionTwo = Meteor.wrapAsync(functionTwoAsync);



 var functionThreeAsync = function(error, accessToken, tokenSecret, goodreadsUserId) {
  if (error) {
    console.log('error in storing')
    console.log(error)
  }
  else {
    Meteor.users.update({_id: Meteor.userId()}, {$set: {'profile.goodreads.accessToken': accessToken, 'profile.goodreads.tokenSecret': tokenSecret, 'profile.goodreads.userID': goodreadsUserId}});
    console.log('reached storing in user collection')
  }
}
var functionThree = Meteor.wrapAsync(functionThreeAsync);

【问题讨论】:

  • 显示functionTwo的代码
  • @Yuri 我已经贴好了,请看上面

标签: javascript node.js meteor callback


【解决方案1】:

Meteor 为回调地狱提供了很好的解决方案。

如果您已经使用 Meteor.wrapAsync 包装了函数,那么您应该能够像这样运行它们(伪代码):

try {
 var resultOne = functionOne();
 var resultTwo = functionTwo(resultOne.accessToken, resultOne.tokenSecret, ...)
 var resultThree = functionThree(resultOne.accessToken, resultOne.tokenSecret, ...)
} catch ( e ) {
   console.error('functionOne or functionTwo or functionThree thrown error = ', e);
} 

如果你想像上面那样运行它们,你需要像这样实现你的函数:

var functionTwoAsync = function(accessToken, tokenSecret, callback) {
  request.get('https://www.goodreads.com/api/auth_user', {
    oauth: {...}
  },
  function (error, response, body) {
    if (!error && response.statusCode === 200) {

      // IMPORTANT !!!
      return callback(
            null, 
            { 
              accessToken : accessToken,
              tokenSecret : tokenSecret,
              goodreadsUserId : goodreadsUserId
            }
      )
    } else {
      return callback(error)
    }
  })
}
var functionTwo = Meteor.wrapAsync(functionTwoAsync);

【讨论】:

  • 是否有必要将一个对象中的所有值传递给下一个函数?或者我可以保持简单,就像我已经完成的那样传递多个值吗?我会试试你的方法,让你知道我是怎么做的。感谢您的意见
  • 如果你想从前一个函数返回多个变量,那么这是必要的。
  • 表示回调没有通过。
  • 这只是一个例子,它表明您可以将任意数量的参数传递给使用 Meteor.wrapAsync 包装的函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多