Обещание не работает в приложении 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);

};
Другие вопросы по тегам