#javascript #node.js #express #graphql #async.js
#javascript #node.js #выразить #graphql #async.js
Вопрос:
Не поймите меня неправильно, я был вынужден использовать водопад, потому что мне нужно выполнять одну функцию за другой. Нет никаких проблем, связанных со схемой или типом возвращаемого значения, просто застрявшим с асинхронным водопадом. Все, что мне нужно, это вернуться из конечной функции не раньше.
const async = require('async')
module.exports = {
logout : ()=>{
return async.waterfall([
callback => {
setTimeout(() => {
let data = 1;
return callback(null, data)
}, 2000);
},
(data, callback) => {
setTimeout(() => {
return callback(null, data 1)
}, 2000);
}
], (err, res)=>{
console.log(res)
return res
})
}
}
ответ от graphiql, потому что он возвращается раньше. И консоль.журнал работает
{
"errors": [
{
"message": "Cannot return null for non-nullable field RootMutation.logout.",
"locations": [
{
"line": 4,
"column": 3
}
],
"path": [
"logout"
]
}
],
"data": null
}
Ответ №1:
Не могли бы вы использовать async / await здесь? В соответствии с приведенным ниже
async function logout(){
let data = await new Promise((resolve,reject) => {setTimeout(() => { resolve(1)},2000)});
data = await new Promise((resolve,reject) => {setTimeout(() => { resolve(data 1)},2000)});
return data;
}
async function foo() {
let res = await logout();
alert(res)
}
foo()
Также я не знаком с библиотекой async, но если вы действительно возвращаете async.waterfall()
вызов в вашем примере, поскольку он возвращается undefined
в соответствии с документами.
Возможно, просто
const async = require('async')
module.exports = {
logout : ()=>{
async.waterfall([
callback => {
setTimeout(() => {
let data = 1;
return callback(null, data)
}, 2000);
},
(data, callback) => {
setTimeout(() => {
return callback(null, data 1)
}, 2000);
}
], (err, res)=>{
console.log(res)
return res
})
}
}
Если нет, возможно, поделитесь, какую библиотеку GraphQL вы также используете