获取返回的promise而不是value

时间:2015-11-04 16:18:15

标签: promise return-value fetch

希望以下代码清楚地传达问题。问题是在使用get fetchData方法的模块中,返回的值是实际的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

1 个答案:

答案 0 :(得分:1)

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

您可以像这样访问值:

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

另请注意,您正在以非惯用的方式使用承诺并创建一个厄运之塔。"这在眼睛上更容易,并完成同样的事情:

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();