Javascript 为什么我的异步';。然后';不等待提取完成?

Javascript 为什么我的异步';。然后';不等待提取完成?,javascript,node.js,fetch,Javascript,Node.js,Fetch,从我对承诺的理解来看,我应该能够在一个“.then”中运行一些东西,在承诺返回后,我希望在那个时候完成一个获取。但由于某些原因,我无法在对node.js应用程序进行提取后重新加载页面 fetch("http://localhost:3000/").then(response => { console.log(response); }).catch(error => { console.log(error); }).then(wi

从我对承诺的理解来看,我应该能够在一个“.then”中运行一些东西,在承诺返回后,我希望在那个时候完成一个获取。但由于某些原因,我无法在对node.js应用程序进行提取后重新加载页面

    fetch("http://localhost:3000/").then(response => {
        console.log(response);
    }).catch(error => {
        console.log(error);
    }).then(window.location.reload(false));
我甚至试着在它上面放一个计时器,看看是否需要更多的服务器端时间,但它仍然会立即运行,忽略计时器:

    .then(function() {
        window.location.reload(false)
    }, 5000);

这可能是由于fetch与node.js应用程序的交互方式造成的,还是因为我的实现中遗漏了什么?

那么
需要的是函数,而不是语句。尝试
。然后(()=>window.location.reload(false))
。一条语句在求值时将被执行,因此您最终会重新加载页面(我猜是无限的?

问题是,当您设置
window.location.reload(false)
之后,它会在同一时刻被调用,以等待函数触发,您需要传递一个空函数,它将在之后被触发

fetch(“https://api.github.com/orgs/nodejs)然后(响应=>{
log(“我们得到响应”)
控制台日志(响应);
}).catch(错误=>{
console.log(错误);
}).然后(()=>{
log(“我们移动…”)
//该行已注释,因此不会无限循环。
//window.location.reload(false)
});正如我们从ES5标准中了解到的“Promise”的概念,在ES5标准中,它使代码无阻塞,并且本身具有回调函数,如.then()或.catch()用于错误处理。
在这里,您试图使代码同步,因此下面是使用async await as fetch()返回承诺解析或拒绝某些值的方法

Eg

wait用于异步暂停,然后是同步执行流,并等待承诺带有已解决或拒绝的值。上面的fetchResult将具有解析值或拒绝值,或者表示错误。如果我们不使用async await,那么我们必须使用.then()回调函数来访问Promise解析或拒绝的值。

Await用于等待ECMA异步代码中的回调地狱问题。

带有实际回调函数的版本将正常工作,您似乎只是将then与setTimeout混淆了。在您的then上。你的控制台记录了什么?或者问题只出现在重新加载窗口时?
我甚至试着放一个计时器
,您在哪里读到可以将计时器作为第二个参数添加到
然后
那么
不提供这样的功能吗?我确实对setTimeout感到困惑,谢谢。@panoskarajohn问题只是重新加载运行得很快。我希望抓取在运行之前完成。我的意思是。。。从技术上讲,您的第二个代码片段应该是有效的。
5000
将不会执行任何操作,但第一次回调将在提取完成后调用。你是如何确定第二个不起作用的呢?句子
问题是,当你在then之后设置window.location.reload(false)时,对于
.then(window.location.reload(false)),有点误导窗口.location.reload(false)
未放置在
之后。然后
<调用code>reload
,其结果作为参数传递给
,然后
。我更好地解释了解决方案和问题。起初我误解了答案,但我仍然认为它没有那么有用。我的理由是op已经尝试过类似的解决方案,但没有成功(参见尝试2)。因此,要么是问题中还没有出现的其他问题,要么是OP错误地确定他们的第二次尝试没有成功。不,@user400654第二次尝试的问题是@t.niese在问题上所说的,他试图在
then
子句中的函数上设置计时器,但这种方法不存在,因此它不起作用。@PrinceHernandez,除非。。。事实上,它确实有效@诺索德夫你说它不起作用是什么意思?如果以这种方式编写,则在
fetch(“http://localhost:3000/“
完成。你怎么知道它不起作用呢?如果之后真的调用了它,我猜服务器端的函数所用的时间比我预期的要长。我看不到fetch在上引起的更改reload@notsodev可能您遇到错误(可能您请求
http://localhost:3000/
来自不同的域,如
http://localhost/
导致CORS错误)
.catch(error=>{console.log(error);})。然后(()=>window.location.reload(false))
即使发生错误也会重新加载,因为您在重新加载之前捕获错误。@t.niese我在node.js应用程序上设置了访问控制允许Origin从我调用它的位置接受。我在控制台中没有看到任何错误,也没有看到正在返回的承诺承诺不使代码非阻塞如果
那么
回调中的代码块阻塞,那么它将保持阻塞状态。Promissions允许更轻松地管理异步结果的代码执行顺序。
await fetchResultTemp=fetch(“https://api-dev.abc/employees");无效。如果您已经建议使用
异步
/
等待
,那么为什么要使用
然后
呢?使用
然后
可以获得解析值,这是正确的。在
async
函数中,您可以使用
wait
来获取解析值,而不是使用
然后使用
来消除链接<代码>常量数据=等待获取(“https://api-dev.abc/employees");。然后((数据)=>{return data;})
是一个否定选项。当您在不做任何事情的情况下传递
数据时。Morover
print(employeeList())
将一个承诺传递给
print
,该承诺解析为
未定义的
,因为您不返回任何存储在中的函数
const employeeList = async () => {
fetchResult  = await fetch("https://api-dev.abc/employees");
return fetchResult;
}
console.log(employeeList());