【问题标题】:Promise is not working in azure function app javascriptPromise 在 azure function app javascript 中不起作用
【发布时间】:2019-01-24 13:33:40
【问题描述】:

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

【问题讨论】:

  • 该代码最终肯定会运行 console.log(resolve)'foo' 如果该进程在一秒钟后仍在运行。你后来看输出了吗?
  • 请注意,没有理由标记该函数async。它从不使用await
  • 可以贴一下context.log函数的代码吗?
  • 是的@T.J.Crowder 我在复制日志之前等待

标签: javascript promise azure-function-async


【解决方案1】:

在函数返回后,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");
}

【讨论】:

    【解决方案2】:

    也许代替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);
    
    };
    

    【讨论】:

      猜你喜欢
      • 2017-12-22
      • 1970-01-01
      • 2021-01-03
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      • 1970-01-01
      相关资源
      最近更新 更多