【问题标题】:Nodejs loop through same API with different parametersNodejs循环使用不同参数的相同API
【发布时间】:2017-07-04 10:48:13
【问题描述】:

我尝试循环遍历相同的 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 承诺但没有奏效,知道怎么做吗?

【问题讨论】:

  • 哪里失败了?
  • 在上面的例子中它永远不会失败,它只是保持循环。
  • 把你的循环++放在所有 if else 条件之外。
  • 您正在检查 APIResult 的值,这似乎是异步方法。使用回调,然后超时可能会等待一段时间,然后再次访问 API。
  • @Chandra Eskay 将 loop++ 放在外面没有用。

标签: node.js api loops q


【解决方案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();

【讨论】:

  • 感谢@galkin 的回复,那么上面的代码在节点v6.11.0 中不能运行?
  • 尝试了您的代码,但由于某种原因,现在没有从 API 响应返回的记录。我什至在请求回调函数中放置了一个调试代码,看起来它甚至没有到达那里。
  • 是的,此代码在没有 babel 的 6.11 Node.js 上不起作用 (babeljs.io)。正如我所写,你将是使用 async/await 的最佳解决方案。或者你应该学习 Promises/callbacks/generators 人员。
猜你喜欢
  • 2020-11-09
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多