【发布时间】:2017-08-21 05:47:55
【问题描述】:
我正在处理一个需要我将 JavaScript 与 API 方法调用一起使用的项目。我是一名 Java 程序员,之前从未做过 Web 开发,所以我遇到了一些麻烦。
此 API 方法是异步的,它处于一个 while 循环中。如果它返回一个空数组,则 while 循环结束。否则,它会循环。代码:
var done = true;
do
{
async_api_call(
"method.name",
{
// Do stuff.
},
function(result)
{
if(result.error())
{
console.error(result.error());
}
else
{
// Sets the boolean to true if the returned array is empty, or false otherwise.
done = (result.data().length === 0) ? true : false;
}
}
);
} while (!done);
这不起作用。循环在“完成”的值更新之前结束。我已经对该主题进行了一些阅读,似乎我需要使用承诺或回调,因为 API 调用是异步的,但我不明白如何将它们应用于我上面的代码。
我们将不胜感激!
【问题讨论】:
-
你真的需要使用while循环吗?异步的想法。编程是为了避免循环直到完成某些事情,但使用回调(在您的情况下为
function(result))来更新 UI。 -
您的
async_api_call我已经开除,所以它会通过,它不会;不等待回调。这不是异步调用的目的吗?先阅读这篇stackoverflow.com/questions/748175/…,也许它会阐明异步函数的含义。而且因为您还不能更新 done 变量,所以 !done 是 false 并且会中断 do while 循环。 -
不幸的是,我需要循环
async_api_call多次。这是因为有问题的方法只处理50个批次的数据,而我需要处理的项目有数千个,所以我需要继续循环它,直到处理完所有项目。 -
要理解的重要一点是,内部函数(function(result))将在稍后的某个时间点执行,可能在父函数完成执行很久之后; async_api_call 在异步操作完成并且 then 执行回调之前不会阻塞,它会更早返回并在工作完成时执行回调。已经有一些有帮助的答案,只是想说明一下。
-
这里可以用es6吗?
标签: javascript asynchronous while-loop