没有设置响应。这是否在未作为承诺返回的异步调用中使用
No response has been set. Is this being used in an async call that was not returned as a promise
我遇到了以下错误。
Error: No response has been set. Is this being used in an async call that was not returned as a promise to the intent handler?
at DialogflowConversation.response (/user_code/node_modules/actions-on-google/dist/service/actionssdk/conversation/conversation.js:162:19)
at DialogflowConversation.serialize (/user_code/node_modules/actions-on-google/dist/service/dialogflow/conv.js:134:89)
at Function.<anonymous> (/user_code/node_modules/actions-on-google/dist/service/dialogflow/dialogflow.js:154:28)
at next (native)
at fulfilled (/user_code/node_modules/actions-on-google/dist/service/dialogflow/dialogflow.js:19:58)
at process._tickDomainCallback (internal/process/next_tick.js:135:7)
我会post我的代码,在这我使用了promise。如果我在承诺执行中有误,请纠正我。
public getTodaysEntryOfUser(conv: any) : any {
this.getDataFromDatabase(conv).then((todaysEntry) => {
conv.ask('<speak>Welcome to my applicatoion <break time="1"/> </speak>');
let question:Question = this.getStartQuestion(1);
conv.ask('<speak>'+question.ask+'</speak>');
conv.data.kind = question.resolution.kind;
return question;
})
.catch(err => {
console.log('Error getting document', err);
return err;
});
}
方法代码"getDataFromDatabase"
public async getDataFromDatabase(conv: any) : Promise<any> {
let getPromise = await this.getDAOaccess(conv);
return getPromise;
}
getDAOaccess 方法的代码
private getDAOaccess(conv:any) : Promise<any>{
return new Promise<any>((resolve,reject) => {
this.getDataFromDB(conv,(err:any,response:any)=>{
if(err)
reject(err);
else
resolve(response);
});
});
}
getDataFromDB 方法的代码
private getDataFromDB(conv:any, callback: (err:any,response:any) => void ) : Promise<any> {
let self = this;
let documentDetail;
let subjectId = conv.request.user.userId;
let questionID = conv.request.user.questionID;
let docRef= this.dbManager.collection('question').doc(subjectId);
return new Promise((resolve, reject) => {
docRef.get().then(doc => {
documentDetail = doc;
conv.user.response= doc.data();
return resolve(doc.data());
})
.catch(err => {
console.log('Error getting document', err);
reject(err);
});
});
}
请让我知道代码中的问题。提前致谢
您的方法 getDataFromDB
看起来很混乱。您已经定义了一个参数 callback
,该参数从未被使用过。相反,方法 return 是一个 Promise
,但是当您调用它时,您将忽略 returned 值,因为您正在传递未使用的 callback
参数。
更改 getDAOaccess
以使用 Promise
:
private getDAOaccess(conv:any) : Promise<any>{
return this.getDataFromDB(conv);
}
现在很明显 getDAOaccess
什么都不做,因此您可以从代码中删除它并直接从 getDataFromDatabase
.
调用 getDataFromDB
这段代码也是一头雾水。它 return 是一个 Promise
,因此您实际上不必 await
内部调用,只需 return 它 return 编辑的 Promise
。
public async getDataFromDatabase(conv: any) : Promise<any> {
let getPromise = await this.getDAOaccess(conv);
return getPromise;
}
应该是:
public getDataFromDatabase(conv: any) : Promise<any> {
return this.getDataFromDB(conv);
}
现在你看到这个方法也什么都不做。
现在外部调用有问题。您想要 return 一个结果,但内部调用是异步的。可能最好的办法是将此方法标记为 async
:
public async getTodaysEntryOfUser(conv: any) {
const todaysEntry = await this.getDataFromDB(conv);
conv.ask('<speak>Welcome to my applicatoion <break time="1"/> </speak>');
let question:Question = this.getStartQuestion(1);
conv.ask('<speak>'+question.ask+'</speak>');
conv.data.kind = question.resolution.kind;
return question;
}
此方法现在 return 是一个 Promise<Question>
,无论您在哪里调用 getTodaysEntryOfUser
(如果数据库调用失败 Promise
将拒绝并且拒绝只会向上传播,因此不需要 return err
任何地方。请注意,您不必告诉编译器 return 类型,它会自行正确解决。也您应该避免将任何参数声明为 any
类型,找出实际类型以获得更好的错误消息。
问题是 getTodaysEntryOfUser()
不是 returnPromise。假设这是意图处理程序(如果是这样,你不会显示你是如何注册它的),Dialogflow 库将不 return Promise 的函数视为所有同步操作并立即处理它.
如果您进行异步调用,您需要确保:
- 您调用
conv.ask()
作为解决 Promise 的一部分
- 你return一个承诺
在这种情况下,只需确保将 return
放在
行之前即可
this.getDataFromDatabase(conv).then(
我遇到了以下错误。
Error: No response has been set. Is this being used in an async call that was not returned as a promise to the intent handler?
at DialogflowConversation.response (/user_code/node_modules/actions-on-google/dist/service/actionssdk/conversation/conversation.js:162:19)
at DialogflowConversation.serialize (/user_code/node_modules/actions-on-google/dist/service/dialogflow/conv.js:134:89)
at Function.<anonymous> (/user_code/node_modules/actions-on-google/dist/service/dialogflow/dialogflow.js:154:28)
at next (native)
at fulfilled (/user_code/node_modules/actions-on-google/dist/service/dialogflow/dialogflow.js:19:58)
at process._tickDomainCallback (internal/process/next_tick.js:135:7)
我会post我的代码,在这我使用了promise。如果我在承诺执行中有误,请纠正我。
public getTodaysEntryOfUser(conv: any) : any {
this.getDataFromDatabase(conv).then((todaysEntry) => {
conv.ask('<speak>Welcome to my applicatoion <break time="1"/> </speak>');
let question:Question = this.getStartQuestion(1);
conv.ask('<speak>'+question.ask+'</speak>');
conv.data.kind = question.resolution.kind;
return question;
})
.catch(err => {
console.log('Error getting document', err);
return err;
});
}
方法代码"getDataFromDatabase"
public async getDataFromDatabase(conv: any) : Promise<any> {
let getPromise = await this.getDAOaccess(conv);
return getPromise;
}
getDAOaccess 方法的代码
private getDAOaccess(conv:any) : Promise<any>{
return new Promise<any>((resolve,reject) => {
this.getDataFromDB(conv,(err:any,response:any)=>{
if(err)
reject(err);
else
resolve(response);
});
});
}
getDataFromDB 方法的代码
private getDataFromDB(conv:any, callback: (err:any,response:any) => void ) : Promise<any> {
let self = this;
let documentDetail;
let subjectId = conv.request.user.userId;
let questionID = conv.request.user.questionID;
let docRef= this.dbManager.collection('question').doc(subjectId);
return new Promise((resolve, reject) => {
docRef.get().then(doc => {
documentDetail = doc;
conv.user.response= doc.data();
return resolve(doc.data());
})
.catch(err => {
console.log('Error getting document', err);
reject(err);
});
});
}
请让我知道代码中的问题。提前致谢
您的方法 getDataFromDB
看起来很混乱。您已经定义了一个参数 callback
,该参数从未被使用过。相反,方法 return 是一个 Promise
,但是当您调用它时,您将忽略 returned 值,因为您正在传递未使用的 callback
参数。
更改 getDAOaccess
以使用 Promise
:
private getDAOaccess(conv:any) : Promise<any>{
return this.getDataFromDB(conv);
}
现在很明显 getDAOaccess
什么都不做,因此您可以从代码中删除它并直接从 getDataFromDatabase
.
getDataFromDB
这段代码也是一头雾水。它 return 是一个 Promise
,因此您实际上不必 await
内部调用,只需 return 它 return 编辑的 Promise
。
public async getDataFromDatabase(conv: any) : Promise<any> {
let getPromise = await this.getDAOaccess(conv);
return getPromise;
}
应该是:
public getDataFromDatabase(conv: any) : Promise<any> {
return this.getDataFromDB(conv);
}
现在你看到这个方法也什么都不做。
现在外部调用有问题。您想要 return 一个结果,但内部调用是异步的。可能最好的办法是将此方法标记为 async
:
public async getTodaysEntryOfUser(conv: any) {
const todaysEntry = await this.getDataFromDB(conv);
conv.ask('<speak>Welcome to my applicatoion <break time="1"/> </speak>');
let question:Question = this.getStartQuestion(1);
conv.ask('<speak>'+question.ask+'</speak>');
conv.data.kind = question.resolution.kind;
return question;
}
此方法现在 return 是一个 Promise<Question>
,无论您在哪里调用 getTodaysEntryOfUser
(如果数据库调用失败 Promise
将拒绝并且拒绝只会向上传播,因此不需要 return err
任何地方。请注意,您不必告诉编译器 return 类型,它会自行正确解决。也您应该避免将任何参数声明为 any
类型,找出实际类型以获得更好的错误消息。
问题是 getTodaysEntryOfUser()
不是 returnPromise。假设这是意图处理程序(如果是这样,你不会显示你是如何注册它的),Dialogflow 库将不 return Promise 的函数视为所有同步操作并立即处理它.
如果您进行异步调用,您需要确保:
- 您调用
conv.ask()
作为解决 Promise 的一部分
- 你return一个承诺
在这种情况下,只需确保将 return
放在
this.getDataFromDatabase(conv).then(