获取返回的承诺而不是价值

fetch returning promise rather than value

希望下面的代码能清楚地传达问题。问题在于,在使用 fetchDataget 方法的模块中,返回的值是实际的 Promise,而不是所需的 JSON。对此有什么想法吗?

// fetchData.js module
var _ = require('lodash');


function get() {
  var endpoint1 = `/endpoint1`;
  var endpoint2 = `/endpoint2`;

  return fetch(endpoint1)
    .then((endpoint1Response) => {
      return endpoint1Response.json()
        .then((endpoint1JSON) => {
          return fetch(endpoint2)
            .then((endpoint2Response) => {
              return endpoint2Response.json()
                .then((endpoint2JSON) => {
                  var data = _.merge({}, {json1: endpoint1JSON}, {json2: endpoint2JSON});
                  console.log('data in fetch', data); // this logs the json
                  return data;
                });
            });
        });
    });
}

exports.get = get;

// module which uses get method of fetchData get
var fetchData = require('fetchData');
var data = fetchData.get();
console.log('returned from fetchData', data); // this logs a Promise

是的,这正是应该发生的事情。承诺的全部意义在于它们的结果值不是立即可用的,并且不会仅仅因为您从单独的模块中获得一个而改变。

您可以像这样访问值:

var fetchData = require('fetchData');
fetchData.get().then(data =>
    console.log('returned from fetchData', data);
);

另请注意,您正在以一种非惯用的方式使用 promise 并创建一个 "tower of doom." 这在视觉上要容易得多并且可以完成同样的事情:

function fetchJson(endpoint) {
    return fetch(endpoint)
        .then(endpointResponse => endpointResponse.json()); 
}

function get() {
    var endpoint1 = `/endpoint1`;
    var endpoint2 = `/endpoint2`;

    return Promise.all([fetchJson(endpoint1), fetchJson(endpoint2)])
        .then(responses => {
            var data = { json1: responses[0], json2: responses[1] };
            console.log('data in fetch', data); // this logs the json
            return data;
        });
}

编辑 我没有在 JavaScript 中使用 async/await,但为了回答你的问题,我认为这会起作用:

async function fetchJson(endpoint) {
    var res = await fetch(endpoint);
    return res.json();
}

async function get() {
    var endpoint1 = `/endpoint1`;
    var endpoint2 = `/endpoint2`;

    var data = { 
        json1: await fetchJson(endpoint1), 
        json2: await fetchJson(endpoint2) 
    };

    console.log('data in fetch', data); // this logs the json

    return data;
}

// module which uses get method of fetchData get
async function main() {
    var fetchData = require('fetchData');
    var data = await fetchData.get();
    console.log('returned from fetchData', data);
}

return main();