Promise.All不等待Promise解决

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Promise.All不等待Promise解决相关的知识,希望对你有一定的参考价值。

当我向服务器发出请求时,数据将作为承诺(如预期的那样)返回,其中包含正确的数据,但是由于某些原因,程序无法正确执行。

此外,在我将其上传到Zeit之前,该程序已经正常工作。

获取请求:

1)我知道我不需要'content-type':'application / json'。删除它不会影响程序。

2)这是一个GET请求,并且端点工作正常。另外,当我在Postman中执行相同的确切请求时,也会得到正确的结果。

// CODE ABOVE DOES NOT MATTER
       .then( ([hours, employees, dayLabor]) => {
           // hours, employees, and dayLabor are empty lists for this exercise '[]'

            let business = fetch(`${config.URL}/${TokenService.getId()}`,
            {
                headers: {
                    'content-type': 'application/json',
                    'table':'business',
                    'Authorization':`bearer ${TokenService.getAuthToken()}`
                }
            })
            .then(data => {
              console.log('business: ',data, ' or ', data.json());
              if (!data.ok){
                  return data.json().then(e => Promise.reject(e));}

              return data.json();
            });


            return Promise.all([business, hours, employees, dayLabor]);
      })
      .then( ([business, hours, employees, dayLabor]) => {  
            // THIS is never executed?

            console.log('completed');            

            //fetch has been completed and the state has been updated so set "fetched" to true

            this.setState({business, hours, employees, 'dayLabor': dayLabor.length>0? this.sort(dayLabor):[], fetched: true});


      })
      .catch(error => {
            console.error({error});
      });

输出结果(出于隐私原因将网址括起来):

business:  
Response {type: "cors", url: "https://xxxxxx.herokuapp.com/1", redirected: false, status: 200, ok: true, …}
type: "cors"
url: "https://xxxxxxxx.herokuapp.com/1"
redirected: false
status: 200
ok: true
statusText: "OK"
headers: Headers {}
body: (...)
bodyUsed: true
__proto__: Response
  or  
Promise {<pending>}
__proto__: Promise
[[PromiseStatus]]: "resolved"
[[PromiseValue]]: Array(1)
0: {id: 1, business_name: "Fake Company Inc"}
length: 1
__proto__: Array(0)

我想访问“ [[PromiseValue]]”内部的对象。我对为什么它不起作用感到困惑,特别是因为当我在本地运行它时它确实起作用了?似乎问题出在“业务”变量或“ Promise.all”不在等待承诺的解决。

任何帮助将不胜感激,我一直在搜寻,找不到任何解决方案。

答案

一个特殊的问题是,您只能拨打一次data.json()。它读取http响应的其余部分(正文),然后进行解析)。一旦读取,将无法再次读取。因此,当您这样做时:

console.log(..., data.json())

您正在指示响应对象读取响应主体并返回一个诺言,该诺言将告诉您完成的时间。然后,您记录尚未兑现的承诺。而且,然后您将那个承诺丢在了地板上,再也没有做任何事情。

然后,稍后在您的代码中,您进行

return data.json();

但是没有更多的响应主体,已经被阅读。您不能多次拨打此电话。因此,这将不起作用。

因此,要解决的第一件事是从data.json()中删除console.log()并仅放[

return data.json();

读取正文并解析一次响应。

以上是关于Promise.All不等待Promise解决的主要内容,如果未能解决你的问题,请参考以下文章

等待Promise.All都没有在Anuglar中等待

使用 Promise.all 避免等待每个单独的循环迭代

Promise.all() 与等待

并行解决承诺

面试题系列---什么是Promise,解决什么问题?Promise.all解决了什么问题?实现原理?回调地狱?

Promise.all 和 .map 函数的异步/等待无法按预期工作