我的功能如下:
function callApi(url){
return fetch(url).then(response => {return response.json()}
).then(response => {return response})
}
function myFunction() {
var status = null;
while (status != "complete") {
setTimeout(function(){
callApi('myurl').then(response => {
status = response.status
}
}, 5000)
}
在这里,我只是想检查一下我是否从api电话中获得了所需的状态。
直到我想要每隔5秒检查一次的api电话获得所需的状态..
但这不起作用.. 我根据自己的需要用谷歌搜索但不理解解决方案。 如果有人能回答这个问题会非常有帮助。
我是javascript的新手。我看过es6
承诺的某个地方。
如果有人能够解释这一点,那将是非常好的。
谢谢
答案 0 :(得分:1)
将此助手放在所有脚本中:
var wait = ms => new Promise(resolve => setTimeout(resolve, ms));
然后再也不会再调用setTimeout
(它具有可怕的错误处理特性)。
此外,while
是一个同步构造,在这里不起作用。您可以使用异步“递归”。此外,为了对异步操作进行排序,必须链接promise:
function myFunction() {
return callApi('myurl').then(response =>
response.status == "complete" ? response : wait(5000).then(() => myFunction()));
}
答案 1 :(得分:0)
当前代码有一些拼写错误(then
和myFunction
上缺少关闭braclets)和一个大缺陷。
setTimeout
不是阻止函数,因此您在while
循环中运行的次数比您想象的多。
你正在创造很多以后的功能'这将在5秒后执行。
现在,您的代码流程就是这样做的。
第2行将在前5秒通过之前运行数千次。
这是您的代码,没有拼写错误,但主要问题仍然存在。
function myFunction()
{
var status = null;
while (status != "complete")
{
setTimeout(function()
{
callApi('myurl').then(response => { status = response.status }); //<-- missing ')'
}, 5000);
}
}
至于主要问题,你不应该编写每X秒检查一次的代码。如果发生了什么事情,你应该使用Promise API并向done
事件添加一个函数。
这样,只有当asyncronous函数中的前一个代码完成时,您所需的代码才会运行。