Javascript 然后在ES6 fetch调用中使用函数 我一直在寻找解决这个问题的方法,如果我的搜索技巧没有达到标准,道歉。p>
我的问题:我正在获取一个API,我想知道所有数据何时都已完全加载。通过阅读文档,我似乎可以将.then语句与fetch链接起来,我认为这会起作用。但是,它们似乎都在同一时间开火,而不必等待前一个。然后完成 这是我的代码:Javascript 然后在ES6 fetch调用中使用函数 我一直在寻找解决这个问题的方法,如果我的搜索技巧没有达到标准,道歉。p>,javascript,ecmascript-6,promise,fetch-api,Javascript,Ecmascript 6,Promise,Fetch Api,我的问题:我正在获取一个API,我想知道所有数据何时都已完全加载。通过阅读文档,我似乎可以将.then语句与fetch链接起来,我认为这会起作用。但是,它们似乎都在同一时间开火,而不必等待前一个。然后完成 这是我的代码: fetch(myUrl, { method: 'post', headers: { 'Content-Type': 'application/json; charset=utf-8', }, credent
fetch(myUrl, {
method: 'post',
headers: {
'Content-Type': 'application/json; charset=utf-8',
},
credentials: 'include',
body: data
})
.then(fetchStatus)
.then(json)
.then(function(msg){
showSearchResults();
setTimeout(function(){ console.log("Next then should fire after this"); }, 4000);
})
.then(function(){
return console.log("The 2nd is firing!");
});
function fetchStatus(response) {
if (response.status >= 200 && response.status < 300) {
return Promise.resolve(response)
} else {
return Promise.reject(new Error(response.statusText))
}
}
function json(response) {
return response.json()
}
fetch(myUrl{
方法:“post”,
标题:{
“内容类型”:“应用程序/json;字符集=utf-8”,
},
凭据:“包括”,
正文:数据
})
。然后(获取状态)
.then(json)
.then(函数(msg){
显示搜索结果();
setTimeout(function(){console.log(“接下来应该在此之后触发”);},4000);
})
.然后(函数(){
返回console.log(“第二个正在开火!”);
});
函数获取状态(响应){
如果(response.status>=200&&response.status<300){
返回承诺。解决(响应)
}否则{
返回承诺.拒绝(新错误(response.statusText))
}
}
函数json(响应){
返回response.json()
}
如果是异步的,这很好,但是这些事件需要同步,因为我正在尝试处理由上一个调用showSearchResults()创建的内容
非常感谢您的帮助。链接一个
。然后
不保证代码将按顺序执行,除非您已从上一次调用返回了承诺。然后
调用。在您的示例中,如果希望第二个控制台.log
在showSearchResults
之后执行,则应返回showSearchResults()
,并将链接起来。然后
将其关闭(这仅在showSearchResults
返回承诺时有效;如果没有,您将希望将其包装为类似于fetchStatus
的格式)
类似地,如果您想链接一个。然后
关闭设置超时
,您可以编写如下内容:
fetch(url, { method: 'post', etc... })
.then(fetchStatus)
.then(json)
.then(function(msg){
return new Promise(function(resolve, reject){
setTimeout(function() {
console.log("Next then fires after promise resolves");
resolve();
}, 4000)
})
})
.then(function(){
console.log("Second is firing")
})
.catch(err => console.log(error)) // always remember to catch errors!
链接
.then
并不保证代码将按顺序执行,除非您已从上一个调用返回了承诺。then
调用。在您的示例中,如果您希望第二个控制台.log
在showSearchResults
之后执行,则应返回showSearchResults()
并链接您的。然后
将其关闭(这仅在showSearchResults
返回承诺时有效;否则,您将希望将其包装为类似于获取状态
的承诺)
类似地,如果您想链接一个。然后
关闭设置超时
,您可以编写如下内容:
fetch(url, { method: 'post', etc... })
.then(fetchStatus)
.then(json)
.then(function(msg){
return new Promise(function(resolve, reject){
setTimeout(function() {
console.log("Next then fires after promise resolves");
resolve();
}, 4000)
})
})
.then(function(){
console.log("Second is firing")
})
.catch(err => console.log(error)) // always remember to catch errors!
如果您正在使用ES6,请不要忘记
msg=>{…}
函数表示法。它可以节省大量的冗长内容,避免出现var self=this
舞蹈。尝试将showSearchResults
包装在Promise.all中,然后等待它解决问题。不清楚问题出在哪里。您有一个fetch
调用,该链中的每个处理程序仅在前一个处理程序运行后运行.到底是什么问题?(另外:您不应该为showSearchResults
提供某种参数吗?)您需要承诺showSearchResults
,并在then()
callback中返回该承诺您需要将setTimeout
包装到承诺中:新承诺(resolve=>setTimeout(()=>{…;resolve();},4000))
。如果使用ES6,请不要忘记msg=>{…}
函数表示法。它可以节省大量的冗长内容,避免出现var self=this
舞蹈。尝试将showSearchResults
包装在Promise.all中,然后等待它解决问题。不清楚问题出在哪里。您有一个fetch
调用,该链中的每个处理程序仅在前一个处理程序运行后运行.到底是什么问题?(另外:您不应该为showSearchResults
提供某种参数吗?)您需要承诺showSearchResults
,并在then()
callback中返回该承诺您需要将setTimeout
包装到承诺中:新承诺(resolve=>setTimeout(()=>{…;resolve();},4000))
。这正是我所希望的工作方式。我在发布之前尝试过这种方法,但我的承诺中没有“new”关键字,为此我挣扎了一段时间。感谢您的帮助!这正是我所希望的工作方式。我在发布之前尝试过这种方法,但我没有“new”关键字我的承诺中的关键字,并为此奋斗了一段时间。谢谢你的帮助!