Javascript 异步/等待/返回不等待响应
我有一个函数,可以循环浏览电话号码列表。如果其中一个号码符合条件,它会将信息记录在一个表中,然后发送短信并搜索另一个号码是否也符合条件 为了实现这一点,我使用Async/wait,但我的问题是,最后一个发送SMS的函数,我有一个Javascript 异步/等待/返回不等待响应,javascript,node.js,Javascript,Node.js,我有一个函数,可以循环浏览电话号码列表。如果其中一个号码符合条件,它会将信息记录在一个表中,然后发送短信并搜索另一个号码是否也符合条件 为了实现这一点,我使用Async/wait,但我的问题是,最后一个发送SMS的函数,我有一个console.log,然后它有一个返回;我正在以正确的顺序获取日志,但它不会等待返回的响应 这是我的密码 return t.any(Query).then(function(Response){ const getQualifiedUsers = async()
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
,然后返回搜索,而不是发送消息。完成后,它会尝试发送所有短信。因此,它不会等待返回上的响应。我已经改变了很多次,但我似乎不知道我错过了什么,为什么我不能等待回复。这不管用吗?如果要并行运行它们,请查看
我认为您的问题在于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返回承诺,则省略回调:
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);
});
}
它不等待等待的原因是异步函数被同步调用(无等待)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);
}
}
它应该能正常工作
编辑:Oops我在您的insertable()
中遗漏了一些内容,基本上是相同的,因此请更改为以下内容:
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);
}
}
我认为问题在于async/await和promise之间的混合。您等待then的承诺,而不是等待异步函数!!
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);
}
}