2015-11-04 68 views
0

希望以下代碼清楚地傳達問題。問題是,在使用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 
+2

當然,獲取值的唯一方法是在傳遞給Promise的'.then()'方法的函數內部訪問它。 – idbehold

回答

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

可能有一種方法可以通過'async'和'await'完成這個任務嗎? – jerome

+0

@jerome您正在使用的JavaScript版本是否支持異步/等待? – JLRishe

+0

是的。這是一個反應原生項目,它支持一些高級JS功能 - https://facebook.github.io/react-native/docs/javascript-environment.html#content – jerome