0

我有一个简单的演示来理解 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输出日志请帮助我谢谢!

4

2 回答 2

2

在函数返回后,Azure 似乎正在杀死您的进程。因为它没有返回一个 Promise(或者更确切地说,没有返回一个等待你超时的 Promise),所以它没有等待 Promise 回调运行。

您可以使用

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");
}
于 2019-01-24T14:15:50.893 回答
0

也许而不是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);

};
于 2019-01-24T13:42:10.183 回答