Javascript 然后在ES6 fetch调用中使用函数 我一直在寻找解决这个问题的方法,如果我的搜索技巧没有达到标准,道歉。p>

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

我的问题:我正在获取一个API,我想知道所有数据何时都已完全加载。通过阅读文档,我似乎可以将.then语句与fetch链接起来,我认为这会起作用。但是,它们似乎都在同一时间开火,而不必等待前一个。然后完成

这是我的代码:

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”关键字我的承诺中的关键字,并为此奋斗了一段时间。谢谢你的帮助!