AWS Lambda Node.js-来自等待异步函数的返回值问题

时间:2019-11-11 21:30:19

标签: node.js amazon-web-services aws-lambda

这是等待异步功能的AWS Lambda函数。我无法获得返回值。只要服务器上仍有一些要检索的值,我就需要循环获取数据:

let do_search = true;
while (do_search) {
        const url = 'xxx';
        await fetchData(url)
            .then(response => {
                console.log("fetchData result:", response);
                if (response) {
                    console.log("Stop searching, no more data");
                    do_search = false;
                }
            })
.....

当还有更多数据需要处理时,我的fetchData返回false值。 fetchData函数:

async function fetchData(url) {
...
console.log("Returning false");
return false;

问题是什至我的fetchData返回false, 我的日志始终是:

Returning false
fetchData result: true

我还尝试将其他方法用于:

 const createModelBInstance = async () => {
            let response = await fetchData(url)
            console.log("fetchData result:", response);
            if (response){
                do_search=false;
            }
           }

           await createModelBInstance();

基于此论坛上的一些示例。 但是,完全相同的问题是,我的fetchData返回false,而“ fetchData result:true”。

任何可行的例子吗?返回的Promise值导致简单的代码变得非常复杂:(

1 个答案:

答案 0 :(得分:1)

您不应该在JavaScript中编写硬循环。它是单线程的。

这是一个fetchData方法的示例,该方法休眠1秒钟,然后指示数据是否可用(以10%的可能性提供,而不以90%的可能性提供)。这纯粹是为了模拟您的异步URL提取程序。

const getRandom = (low, count) => {
  return Math.floor((Math.random() * count) + low)
}

const fetchData = () => {
  const promise = new Promise((resolve, reject) => {
    setTimeout(() => {
      const rand = getRandom(1, 10);
      if (rand % 7) {
        resolve({ rand });
      } else {
        resolve({ data: 'Here is the data', rand });
      }
    }, 1000);
  });

  return promise;
}

下面是一个示例,每隔2秒钟间隔一次调用此代码,直到数据可用为止。

const interval = setInterval(() => {
  fetchData().then(rc => {
    console.log(rc);
    if (rc.data) {
      // do something with rc.data
      clearInterval(interval);
    }
  });
}, 2000);

输出示例:

{ rand: 2 }
{ rand: 10 }
{ rand: 1 }
{ data: 'Here is the data', rand: 7 }