JavaScript ES6 承诺在 while 循环中调用异步操作
javascript es6 promise to call async actions in while loop
我有一个函数,如下所示:
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 调用中获取所需状态。
直到我从 api 调用中获得所需的状态,我想每 5 秒检查一次。
但这行不通。我已经用谷歌搜索过,但根据我的需要不理解解决方案。如果有人能回答这个问题,那将非常有帮助。
我是javascript的新手。我已经看过es6
承诺。如果有人能解释这一点,那就太好
谢谢
把这个帮助程序放在你所有的脚本中:
var wait = ms => new Promise(resolve => setTimeout(resolve, ms));
然后永远不要再调用setTimeout
(它具有可怕的错误处理特征)。
此外,while
是一个同步构造,在这里不起作用。您可以使用异步"递归"。此外,要对异步操作进行排序,必须链接承诺:
function myFunction() {
return callApi('myurl').then(response =>
response.status == "complete" ? response : wait(5000).then(() => myFunction()));
}
当前代码有一些拼写错误(then
和myFunction
缺少闭合小板)和一个很大的缺陷。
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
事件添加一个函数。这样,只有当异步函数中的前一个代码被芬兰化时,您所需的代码才会运行。
相关文章:
- 无法在mvc视图中使用ajax调用获取操作返回的模型对象列表
- 如何指示“;熟度;在异步操作中
- 使用jquery更改异步操作中的文本值
- 节点.js中的嵌套异步操作
- 是否可以将alertify.js的cancel按钮和onclose调用的操作分开
- jasmine 2-在jasmine指定的超时时间内未调用异步回调.DEFAULT_TIMEOUT_INTERVAL
- 阻止chrome.webRequest.onBeforeSendHeaders侦听器中的异步操作
- Rails:如何在jQuery(.js.erb)中调用“create”操作
- 如果条件,则在其他操作之后调用 Redux 操作
- 节点.js和表达式:如何在异步操作后返回响应
- 有没有办法从 javascript 函数调用控制器操作
- 递归调用异步函数
- 无法在Redux中测试异步操作
- 当我在异步操作Redux上开始单元测试时,没有定义错误承诺
- JavaScript ES6 承诺在 while 循环中调用异步操作
- 请等待异步操作 (firebase) 调用完成,然后再加载网页
- 反应 Redux 异步操作在完成函数后调用下一个函数
- 调用FatSecret Sharp API时,此时无法启动异步操作
- 递归自调用函数和异步操作
- 在调用其他模块之前,请等待异步操作