2016-07-18 150 views
12

Sono nuovo su nodejs. Non vedo la risposta nell'ex 1, ma vedo nell'ex 2. Perché? Aspetto lavori per me in altri posti, usando babele.Perché attendere non funziona per il modulo di richiesta del nodo?

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

attendono lavora in altri luoghi, sto usando Babel e moduli necessari per le funzionalità ES6 e ES7. Ad esempio, attendere funziona squelize chiamata, ho convalidato. Ma non funziona per la chiamata di richiesta. Perché?

+0

FYI, 'async/await' non fa parte della ES7. È ancora solo una proposta. –

+0

Vedere la mia risposta [qui] (http://stackoverflow.com/a/38252603/2410379). Inoltre, anche [questo] (https://tc39.github.io/ecmascript-asyncawait/#async-function-definitions) è utile. –

risposta

27

Si dovrebbe solo await su qualcosa che restituisce una promessa. Consiglio vivamente di leggere su Promises prima di iniziare a lavorare con async e await. Probabilmente si potranno ottenere questo esempio per sviluppare la propria funzione wrapper request per farla tornare una promessa, in questo modo:

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: In alternativa, si può considerare di usare request-promise al posto del modulo di richiesta regolare.

+1

questa dovrebbe essere la risposta – felipekm

8

ES6

Usage: Dove request è 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) 
    } 
} 

Codice:

// 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) 
     }) 
    }) 
Problemi correlati