【发布时间】:2017-07-13 04:00:33
【问题描述】:
我正在使用 Node 7.6.0 版本来尝试原生的 async 和 await 功能。
我试图弄清楚为什么我的异步调用只是挂起从未真正解决。
自然语言处理模块:
const rest = require('unirest')
const Redis = require('ioredis')
const redis = new Redis()
const Promise = require('bluebird')
const nlp = {}
nlp.queryCache = function(text) {
return new Promise(function(resolve, reject) {
redis.get(text, (err, result) => {
if (err) {
console.log("Error querying Redis: ", err)
reject(new Error("Error querying Redis: ", err))
} else {
if (result) {
let cache = JSON.parse(result)
console.log("Found cache in Redis: ", cache)
resolve(cache)
} else {
resolve(null)
}
}
})
})
}
nlp.queryService = function(text) {
console.log("Querying NLP Service...")
return new Promise(function(resolve, reject) {
rest.get('http://localhost:9119?q=' + text)
.end((response) => {
redis.set(text, JSON.stringify(text))
resolve(response.body)
})
})
}
nlp.query = async function(text) {
try {
console.log("LET'S TRY REDIS FIRST")
let cache = await nlp.queryCache(text)
if (cache) {
return cache
} else {
let result = await nlp.queryService(text)
console.log("Done Querying NLP service: ", result)
return result
}
} catch (e) {
console.log("Problem querying: ", e)
}
}
module.exports = nlp
模块消费者:
const modeMenu = require('../ui/service_mode')
const nlp = require('../nlp')
const sess = require('../session')
const onGreetings = async function(req, res, next) {
let state = sess.getState(req.from.id)
if (state === 'GREET') {
let log = {
middleware: "onGreetings"
}
console.log(log)
let result = await nlp.query(req.text)
console.log("XXXXXXXX: ", result)
res.send({reply_id: req.from.id, message: msg})
} else {
console.log("This query is not not normal text from user, calling next()")
next()
}
};
module.exports = onGreetings;
我无法获取代码以继续以下行:
console.log("XXXXXXXX: ", result)
在NLP模块中可以看到查询成功
【问题讨论】:
-
您是否尝试在您尝试“等待”的所有功能上放置“异步”?所以尝试在“new Promise”之前添加“await”。
-
@Gilsdav - 你没有
return await new Promise- async/await 是 Promises 的语法糖 -
显示了哪些其他
console.log消息?你的逻辑似乎很合理 -
大家好,感谢您的关注。如您所见@JaromandaX。只有在 Redis 中找不到 NLP 服务后,我才尝试查询它。 nlp.query() 调用的输出表明调用已成功返回,但它从未将其传递给结果变量。
-
您似乎没有处理来自
rest.get的任何错误,在这种情况下,承诺将无限期地保持未解决(并挂起您的async function)。
标签: javascript node.js promise async-await ecmascript-2017