В вашей функции обещания 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
Редактор VS.NET жалуется на конфигурацию, но она работает.
У меня такая конфигурация ...
<system.serviceModel>
<behaviors configSource="config\system.servicemodel.behaviors.config" />
<bindings configSource="config\system.servicemodel.bindings.config" />
<client configSource="config\system.servicemodel.client.config" />
</system.serviceModel>
... что отлично работает.
Он НЕ будет работать с
, так как это конфигурация SectionGroup, а не конфигурационная секция.
It БУДЕТ отлично работать во время выполнения на чем-либо ниже
- мы делаем это постоянно. Ответ Мартина прекрасно это показывает - его образец будет работать.
Одна вещь, о которой следует помнить при перемещении разделов конфигурации в отдельные файлы: убедитесь, что ваш отдельный файл конфигурации НЕ содержит атрибут configSource. Например, если вы разделите свой раздел привязок таким образом,
<system.serviceModel>
<bindings configSource="yourConfigFile.config" />
</system.serviceModel>
убедитесь, что ваш фактический файл привязок не содержит атрибута «configSource»:
<?xml version="1.0" encoding="utf-8"?>
<bindings>
<!-- binding configuration stuff -->
</bindings>
Я знаю, что это может показаться очевидным, но если вы введете configSource атрибут, а затем вырезать и вставить в новый файл, легко забыть удалить атрибут.
Надеюсь, это поможет.