【问题标题】:Promise.all not waiting for all response Azure Node.js FunctionPromise.all 不等待所有响应 Azure Node.js 函数
【发布时间】:2020-08-01 18:04:29
【问题描述】:

您好,我编写了一个代码,它将调用 n 次外部 api,然后它的响应将传递给另一个函数,最后合并的响应将由 Azure 函数返回,但似乎我没有得到所有人的响应项目。每次运行此代码时它都会不断变化,我认为我的 promise.all 方法存在问题。请查看我的代码

const axios = require('axios');
let globalContext;
var  globalRes = { status: true, products: [] }
const extractProuctFromLUISRes = async (jsonRes, Query) => {
    var quantArray = [];
    var resp = { quantity: 1, UOM: "", query: Query }
    if (jsonRes.entities.hasOwnProperty("UOM") === true) {
        if (jsonRes.entities.UOM.length > 0) {
            resp.UOM = jsonRes.entities.UOM[0][0]
        }
    }
    globalRes.products.push(resp);
}

const splitAndGetProduct = async (text) => {
    //split based on \n
    splitedEmail = text.split("\n");
    let luisCallPromises = [];
    for (var i = 0; i < splitedEmail.length; i++) {
        if (splitedEmail[i].length > 5) {
            luisCallPromises.push(callLuisProducts(splitedEmail[i]));
        }
    }

    let luisResponses = await Promise.all(luisCallPromises);
    for (let luisResponseIterator=0; luisResponseIterator<luisResponses.length; ++luisResponseIterator) {
        if(luisResponses[luisResponseIterator])
            await extractProuctFromLUISRes(luisResponses[luisResponseIterator].prediction, luisResponses[luisResponseIterator].query);
    }
}

const callLuisProducts = async (utterance) => {
    return new Promise(async (resolve, reject) => {
        var finalApiCall = "#httpsCallquery=" + encodeURIComponent(utterance.substring(0, 500));
        //axios call
        try {
            let a = await axios.get(finalApiCall);
            if (a.status == 200) {
                var jsonBody = a.data;
                if (jsonBody.prediction.topIntent == "product") {
                    resolve(jsonBody);
                } else {
                    resolve(false);
                }
            } else {
                resolve(false);
            }
        } catch (error) {
            resolve(false);
        }
    });
}

module.exports = async function (context, req) {
    globalContext = context;
    var inputArray = JSON.parse(req.body.attachmentProcessed);
    await splitAndGetProduct(inputArray);
    finalResolve();
}

function finalResolve() {
    globalContext.res = {
        body: globalRes
    };
    globalRes = { status: true, products: [] }
    globalContext.done();
}

【问题讨论】:

  • 你能在Promise.all之前提供console.log(luisCallPromises)的结果吗?
  • 2020-02-14T13:10:51.443 [信息] [ Promise { }, Promise { }, Promise { }, Promise { }, Promise { }, Promise { }, Promise { }, Promise { }, Promise { }, Promise { }, Promise { } ]跨度>

标签: node.js https async-await azure-functions es6-promise


【解决方案1】:

azure 函数不适用于箭头函数。你需要重写你的代码使用

try{ 
    let answer=await 
    }
catch(e){}

结构

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 2021-03-21
    • 2018-12-02
    • 2020-11-06
    相关资源
    最近更新 更多