2016-07-18 47 views
12

Jestem nowy dla nodejs. Nie widzę odpowiedzi z przykładu 1, ale widzę w 2. Dlaczego? Oczekuję dla mnie pracy w innych miejscach, używając babel.Dlaczego czekać na moduł żądania węzła?

Ex 1

let res = await request(url) 
console.log(res); 
console.log(res.body); 

Ex 2

request(url, function (error, res, body) { 
if (!error && response.statusCode == 200) { 
console.log(body) 
} 
}); 

Oczekujcie działa w innych miejscach, używam Babel i wymaganych modułów dla ES6 i ES7 funkcji. Na przykład, oczekuj na pracę w squelize call, ja sprawdziłem. Ale nie działa w przypadku wywołania żądania. Czemu?

+0

FYI, 'asynchroniczny/await' nie jest częścią ES7. To wciąż tylko propozycja. –

+0

Zobacz moją odpowiedź [tutaj] (http://stackoverflow.com/a/38252603/2410379). Ponadto pomocne jest również [to] (https://tc39.github.io/ecmascript-asyncawait/#async-function-definitions). –

Odpowiedz

27

Powinieneś tylko await coś, co zwróci Obietnicę. Zdecydowanie polecam przeczytanie Obietnicy przed rozpoczęciem pracy z async i await. Prawdopodobnie można dostać ten przykład do pracy, tworząc swoją własną funkcję otoki wokół request aby powrócić obietnicę, tak:

function doRequest(url) { 
    return new Promise(function (resolve, reject) { 
    request(url, function (error, res, body) { 
     if (!error && res.statusCode == 200) { 
     resolve(body); 
     } else { 
     reject(error); 
     } 
    }); 
    }); 
} 

// Usage: 

async function main() { 
    let res = await doRequest(url); 
    console.log(res); 
} 

main(); 

Edit: Można też zajrzeć do korzystania request-promise zamiast zwykłego modułu żądanie.

+1

to powinna być odpowiedź – felipekm

8

ES6

Zastosowanie: Gdzie request jest require('./await-request')

const init = async() => { 
    try { 
     const result = await request({ 
      uri: 'statdirectory/exchange?json', 
      baseUrl: 'https://bank.gov.ua/NBUStatService/v1/', 
      json: true 
     }) 
     console.log(result) 
    } 
    catch (err) { 
     console.error(err) 
    } 
} 

Kod:

// request-service.js 
const request = require('request') 

module.exports = async (value) => 
    new Promise((resolve, reject) => { 
     request(value, (error, response, data) => { 
      if(error) reject(error) 
      else resolve(data) 
     }) 
    })