承诺在返回时返回值而不是Promise

时间:2020-04-09 12:20:02

标签: javascript es6-promise

我想在进行一些HTTP和WS调用后访问一些数据。我已经准备好数据,并且想要访问它们。但是,我没有获得数据,而是获得了数据。


const authenticationRequest = () => axios.post(authenticationUrl, {
  user: username, password
})
  .then((response) => response.data)
  .catch((error) => console.error(console.error('Error Response', error)));


const wsRequest = authenticationRequest().then(reqToken => {
  const webSocketRequest = new WebSocket(topicDataUrl);
  const firstMessage = {
    token: reqToken,
    stats: 2,
    sql: "SELECT * FROM cc_payments LIMIT 100",
    live: false
  };

  var messages = [];

  webSocketRequest.onopen = () => {
    webSocketRequest.send(JSON.stringify(firstMessage));
    webSocketRequest.onmessage = (streamEvent) => {
      of(streamEvent).pipe(
        map(event => JSON.parse(event.data)),
        filter(message => message.type === 'RECORD')
      ).subscribe(message => messages.push(message.data.value));
    };
  };
  return messages; // Here I get my array of Message
});

const data = wsRequest.then(res => res);
console.log(data, 'DATA'); // This returns a Promise<Pending>. with Promsie<value>: Array[100]

问题: 如何返回实际数据而不是Promise?我在做什么错了?

1 个答案:

答案 0 :(得分:1)

wsRequest.then(...)返回了另一个Promise,所以这就是为什么您在控制台中看到Promise<Pending>的原因。

要获取Promise的结果,而不是

const data = wsRequest.then(res => res);
console.log(data, 'DATA');

您可以使用

const data = wsRequest.then(res => console.log(res, 'DATA'));

或者,或者使用更现代的await方法:

const data = await wsRequest;
console.log(data, 'DATA');