2017-09-04 104 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) 
     }) 
     }) 
    }) 
}