2017-09-04 102 views
0
fetchFriends: { 
    type: new GraphQLList(UserType), 
    args: { 
    currentId: { type: new GraphQLNonNull(GraphQLID) } 
    }, 
    resolve: (_, {currentId}) => { 
    return Promise.resolve() 
     .then(() => { 
     User.findById(currentId, (err, users) => { 
      users.getFriends((err, user) => { 
      console.log(user); 
      return user; 
      }); 
     }); 
     }) 

    } 
    /* another version what i tried that returns only the initial findById user 
    resolve: (_, {currentId}) => { 
    var value = User.findById(currentId, (err, user) => { 
     new Promise((resolve, reject) => { 
     user.getFriends((err, user) => { 
      console.log('fetch: ', user); 
      err ? reject(err) : resolve(user) 
     }); 
     }) 
    }) 
    return value; 
    }*/ 
}, 

我有一个graphql的解决方案,我在findById回调中获取User对象。该特定的对象调用getFriends是一个猫鼬插件(friends-of-friends)的一部分,并且getFriends回调中的console.log包含终端中的列表,所以我知道getFriends 正在返回正确的数据,但我无法弄清楚将该值返回到我的React-Native组件。我已经尝试了过去8小时所能想到的一切,并且无法获得此功能返回的值。从Graphql返回列表解决

+0

您是否尝试过使用状态? – bennygenel

回答

0

你接近,但有几件事情与解析器工作时,要记住:

  • 您的解析器必须返回,在指定的类型/标量匹配要么值的模式答案将解析为该值。

  • 猫鼬行动can return a promises,你应该利用他们的这一特点,而不是试图包装内的承诺,因为这回调可以很容易地在这个上下文中回调凌乱

  • return语句至少)实际上并不做任何事情。另一方面,在then中的返回语句决定了承诺将解决什么(或者在链中接下来调用什么承诺)。

我可以想象您的解析器需要看起来像这样:

resolve (_, {currentId}) => { 
    // calling exec() on the query turns it into a promise 
    return User.findById(currentId).exec() 
    // the value the promise resolves to is accessible in the "then" method 
    .then(user => { 
     // should make sure user is not null here, something like: 
     if (!user) return Promise.reject(new Error('no user found with that id')) 
     // we want the value returned by another async method, getFriends, so 
     // wrap that call in a promise, and return the promise 
     return new Promise((resolve, reject) => { 
     user.getFriends((error, friends) => { 
      if (error) reject(error) 
      resolve(friends) 
     }) 
     }) 
    }) 
}