Обещания. Затем и сообщение

Для ошибки Can not connect to the SQL Server. The original error is: Login failed for user 'username'. необходимо выполнить требования к порту на стороне сервера MSSQL.

В брандмауэре Windows необходимо настроить другие порты за пределами стандартного порта 1433.

https://stackoverflow.com/a/25147251/1608670

-1
задан ZADorkMan 25 February 2019 в 12:06
поделиться

2 ответа

Вызовите функции resolve и reject, когда запланированные операции были фактически завершены.

Помните, что при работе с асинхронными операциями код, который вы пишете, выполняется не по порядку, то есть не в том порядке, в котором он записан в файле.

Рассмотрим следующие примеры:

Не будет работать

return new Promise(function (resolve, reject) {
  let result
  fs.someAsyncOperation(function (data) {
    result = data
  })
  resolve(result) // the promise will resolve immediately with undefined value
}

Будет работать

return new Promise(function (resolve, reject) {
  fs.someAsyncOperation(function (result) {
    resolve(result) // the promise will resolve after async operation is completed
  })
}

Ваш код следует переделать, чтобы дождаться результатов асинхронной операции перед вызовом функции resolve.

0
ответ дан Anastazy 25 February 2019 в 12:06
поделиться

В вашей функции обещания sendMessage разрешение должно быть внутри обратного вызова функции sendMail, поскольку оно асинхронное.

    transporter.sendMail(mailOptions, function(error,info){
       resolve();
    });

ОБНОВЛЕНИЕ

Асинхронная работа иногда становится очень сложной, особенно если вы привыкли к синхронным процессам. Когда я начал заниматься программным обеспечением, это привело меня в замешательство.

Вы обещаете, что функции хороши. Проблема заключалась в том, что вы решали функцию отправки до того, как она действительно выполнила свою работу.

Итак, ниже приведена более простая версия вашего кода. Делая то же самое, что вы сделали

// function that returns a message
// duration: 1s
function getMessage() {
    return new Promise(resolve => {
      setTimeout(() => resolve('important message'), 1000)
    });
}

// function that send a message using sendEmail function
// duration should be based on sendEmail
// notice that the resolve is called inside the callback
function sendMessage(message) {
    return new Promise((resolve, reject) => {
       sendEmail(message, (err, result) => {
           // do some stuff if email was sent
       })
       resolve();
    });
}

// function try to send an email asynchronously using a callback
// duration: 0.5s
function sendEmail(message, callback) {
    setTimeout(() => {
        console.log('email sent!')
        callback(null, 'message sent');
    }, 500)
}

getMessage().then(result => {
    return sendMessage(result);
}).then(() => {
    console.log('should be done after email')
})

С помощью приведенного выше кода ваш терминал должен показать

should be done after email
email sent!

Но с некоторыми изменениями в функции sendMessage

function sendMessage(message) {
    return new Promise((resolve, reject) => {
       sendEmail(message, (err, result) => {
            resolve(result);
       })
    });
}

терминал теперь должен показывать

email sent!
should be done after email
0
ответ дан dardardardar 25 February 2019 в 12:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: