Обещание не работает в приложении Azure Javascript
У меня есть простая демоверсия, чтобы понять концепцию Promise, но она не работает должным образом, см. Мой код, который я пробовал.
module.exports = async function (context, iotHubMessage) {
context.log('START');
var promise1 = new Promise(function (resolve, reject) {
setTimeout(function () {
resolve('foo');
}, 1000);
});
context.log(promise1);
promise1.then(function (resolve) {
context.log(resolve);
// expected output: "foo"
});
};
и я получаю этот вывод
2019-01-24T12:58:38.695 [Information] START
2019-01-24T12:58:38.695 [Information] Promise { <pending> }
2019-01-24T12:58:38.696 [Information] Executed
почему не получаю foo
на выходе журнала, пожалуйста, помогите мне спасибо!
2 ответа
Кажется, что Azure убивает ваш процесс после того, как функция вернулась. Поскольку он не возвращал обещание (или, скорее, не возвращал обещание, которое действительно ожидало вашего времени ожидания), он не ожидал выполнения обратного вызова обещания.
Ты можешь использовать
module.exports = function(context, iotHubMessage) {
// ^^^^^^^^ no async necessary here
context.log('START');
var promise1 = new Promise(function (resolve, reject) {
setTimeout(resolve, 1000);
});
context.log(promise1);
var promise2 = promise1.then(function() {
context.log("promise fulfilled");
});
return promise2;
// ^^^^^^^^^^^^^^^^
}
или с async
/await
синтаксис:
module.exports = async function(context, iotHubMessage) {
context.log('START');
var promise1 = new Promise(function (resolve, reject) {
setTimeout(resolve, 1000);
});
context.log(promise1);
await promise1;
// ^^^^^
context.log("promise fulfilled");
}
Возможно вместо promise1.then(...)
пытаться:
module.exports = async function (context, iotHubMessage) {
context.log('START');
var promise1 = new Promise(function (resolve, reject) {
setTimeout(function () {
resolve('foo');
}, 1000);
});
context.log(promise1);
// Use await instead of promise.then(...)
let resolve = await promise1;
context.log(resolve);
};