我有一个遍历电话号码列表的功能。如果其中一个符合条件,它将在表格上记录信息,然后发送SMS并搜索另一个数字是否也符合条件。
要实现这一点,我正在使用Async / Await,但是我的问题是发送短信的最后一个函数是console.log
,然后有一个返回值。我正在按正确的顺序获取日志,但它不是在等待返回的响应。
这是我的代码。
return t.any(Query).then(function(Response){
const getQualifiedUsers = async() => {
try{
if("meets criteria"){
try{
await insertInTable()
}catch(error){
console.log(error);
}
}
}catch(error){
console.log(error);
}
}
getQualifiedUsers();
}
async function insertInTable(){
try{
await db.any(secondQuery).then(function(numberSaved){
const sendAsyncSMS = async () => {
try{
await sendSMS();
}catch(error){
console.log(error);
}
}
sendAsyncSMS();
}
}catch(error){
console.log(error);
}
}
async function sendSMS() {
var date = moment().utc().format('MM-DD-YYYY HH:mm:ss');
console.log('date', date);
return client.messages.create(params, function(err, data, message) {
if(err){
return 'done'
}else{
return 'done'
}
})
.then(message =>
console.log(message.sid)
);
}
有了这个,我得到了回应search-->insert-->log date
,然后返回搜索而不是发送消息。完成后,它将尝试发送所有SMS。因此,它不等待return
上的响应。我已经对此进行了很多次更改,但是我似乎无法弄清我想念的是什么以及为什么我不能等待响应。
答案 0 :(得分:1)
它不等待等待的原因是因为您的异步函数被同步调用(没有等待)getQualifiedUsers()
,所以它运行它,但不等待它完成。
由于您似乎正在兑现承诺,因此可以更改此内容:
return t.any(Query).then(function(Response){
const getQualifiedUsers = async() => {
try{
if("meets criteria"){
try{
await insertInTable()
}catch(error){
console.log(error);
}
}
}catch(error){
console.log(error);
}
}
getQualifiedUsers();
}
对此:
return t.any(Query).then(async function(Response) {
try {
if ("meets criteria") {
try {
await insertInTable()
} catch(error) {
console.log(error);
}
}
} catch(error) {
console.log(error);
}
}
它应该可以正常工作。
编辑:糟糕,我错过了您的insertInTable()
中的某些内容,基本上是相同的,因此请将其更改为以下内容:
async function insertInTable(){
try {
await db.any(secondQuery).then(async function(numberSaved) {
try {
await sendSMS();
} catch(error){
console.log(error);
}
}
} catch(error) {
console.log(error);
}
}
答案 1 :(得分:0)
这行不行吗?如果要并行运行它们,请查看Promise.all。
async function insertInTable(){
try {
await db.any(secondQuery);
await sendSMS();
} catch(error) {
console.log(error);
}
}
答案 2 :(得分:0)
我认为您的问题出在sendSMS函数中,尤其是您将回调传递给client.messages.create函数的事实,这可能会影响诺言。
尝试以下方法:
async function sendSMS() {
var date = moment().utc().format('MM-DD-YYYY HH:mm:ss');
console.log('date', date);
return new Promise(function(resolve, reject){
client.messages.create(params, function(err, data, message) {
if(err)
reject();
else
resolve();
console.log(message.sid);
});
});
}
或者如果函数client.messages.create返回一个Promise,则忽略回调:
async function sendSMS() {
var date = moment().utc().format('MM-DD-YYYY HH:mm:ss');
console.log('date', date);
return client.messages.create(params).then(function(message){
console.log(message.sid);
});
}