【问题标题】:await not waiting to resolve promise等待不等待解决承诺
【发布时间】:2018-10-15 07:22:51
【问题描述】:

这是我在另一个文件中导入的小 twilio 函数/类返回承诺。我收到 errres 在这里承诺返回它

class TwilioService {
  sendSms(to, message) {
    return this.twilio.sendMessage(sms,(err,res) => {
      return new Promise((resolve, reject) => {
        if (err) {
          console.log(err)
          return resolve(res)
        } else {
          console.log(res, 'ppppppppppppppppp')
          return reject(res)
        }
      })
    })
  }
}

现在这是我正在使用该功能的功能。

但是当我执行console.log(sendSms) 时,即使我从 twilio 函数返回承诺,我也会在控制台中得到未定义。我在这里做错了什么。

import Twilio from '../../services/twilio'
const twilio = new Twilio()
const handler = async(request, reply) => {
  try {
    const sendSms = await twilio.sendSms(`+91${mobile}`, `Welcome to App. User ${verificationCode} as your signup OTP.`)
    console.log(sendSms, 'oooooooooooooooo')
  } catch(err) {
    console.log(err)
  }
}

请帮忙!!!谢谢

【问题讨论】:

    标签: javascript node.js asynchronous async-await


    【解决方案1】:

    您现在正在返回 回调,它可能不会返回 Promise - 切换顺序,返回 Promise,当 sendMessage 回调运行时解决.另请注意,如果有errresolve,则应使用reject,如果没有res,则应使用res,而不是相反:

    class TwilioService {
      sendSms(to, message) {
        return new Promise((resolve, reject) => {               // switch these two lines
          return this.twilio.sendMessage(sms, (err, res) => {   // switch these two lines
            if (err) {
              console.log(err)
              return reject(res) // reject on error, don't resolve
            } else {
              console.log(res, 'ppppppppppppppppp')
              return resolve(res) // resolve when there's no error
            }
          })
        })
      }
    }
    

    【讨论】:

    • 这太棒了。你已经在一分钟内回答了。伟大的理解人。最后一个问题将拒绝在异步函数的 catch 部分中抛出错误?我可以在 5 分钟内接受
    • 没错 - 当 Promise 拒绝时,如果 Promise 在别处是 awaited,则 await 行将引发错误(调用 reject 时使用的错误) ,并且如果await 行位于try 块中,则可以捕获该错误,因此流将在catch 块中继续,因为您的代码运行正常。
    • 最后一个问题我可以使sendSms 异步并从中返回值而不是使用new Promise 语法吗?因为异步函数本身返回一个承诺
    • 不幸的是,没有 - 虽然 async 函数确实会自动返回 Promise,但 Promise 没有链接到除 async 函数中的异步 awaits 之外的任何东西。做到这一点的唯一方法是await new Promise((resolve, ... - 但在这种情况下,更容易让sendSms 成为标准函数并返回构造的Promise。 (当您使用 async 函数时,您无法访问等效的 resolve,但在将回调转换为 Promise 时,您需要一个可调用的 resolve
    猜你喜欢
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2018-04-17
    • 2018-03-19
    • 2014-03-12
    相关资源
    最近更新 更多