Nodejs使用不同的参数循环遍历相同的API

时间:2017-07-04 10:48:13

标签: node.js api loops q

我尝试循环遍历相同的API结果,如果API结果为NULL,那么我想要使用不同的参数再次循环几次(即4-5次),如果它达到了第5次。我想退出循环。我尝试的代码如下所示:

var roads = 1000;
var findResult = true;
var loop = 0;

while (findResult) {
  result = APIResult(rarray, roads);
  if (result !== null) {
    findResult = false; // stop the loop
  } else if (loop == 5) {
    findResult = false; // stop the loop
  } else {
    roads = roads * 10;
    loop++;
  }
}

function APIResult(rarray, roads) {
  request.post(
      env.TEST_URL + 'test/',
      {
        json: {
          //...
          roads: roads,
          //..
        },
      },
      function(error, response, body) {
        if (!error && response.statusCode == 200) {
          return JSON.parse(body.rows[0].result);
        }
      });
}

我甚至尝试添加 Q 承诺,但没有成功,不知道该怎么做?

1 个答案:

答案 0 :(得分:1)

您的APIResult函数不会返回任何内容。此函数是异步的,因此它应该返回promise或使用回调。

您的代码result = APIResult(rarray, roads);设置为result变量undefined值。我认为,用于实现异步JS功能的async/await样式将适合您。

当前的最后一个Node.js版本是8.1。它具有对async / await的本机支持。有一个例子,你可以如何实现你的代码:

async function main() {
  var roads = 1000;
  var findResult = true;
  var loop = 0;
  while (findResult) {
    try {
      result = await APIResult(rarray, roads);
    } catch (e) {
      //APIResult reject promise branch
    }

    if (result !== null) {
      findResult = false; // stop the loop
    } else if (loop == 5) {
      findResult = false; // stop the loop
    } else {
      roads = roads * 10;
      loop++;
    }
  }
}

async function APIResult(rarray, roads) {
  return new Promise((res, rej) => {
    request.post(
        env.TEST_URL + 'test/',
        {
          json: {
            //...
            roads: roads,
            //..
          },
        },
        function(error, response, body) {
          if (error) return rej(error);
          if (response.statusCode === 200) return res(JSON.parse(body.rows[0].result));
        });
  });
}

main();