我尝试循环遍历相同的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 承诺,但没有成功,不知道该怎么做?
答案 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();