2016-07-18 2 views
12

Я новичок в nodejs. Я не вижу ответа в ex 1, но я вижу в ex 2. Почему? Ожидание работает для меня в других местах, используя babel.Почему ожидание не работает для модуля запросов узла?

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

Await работает в других местах, я использую столпотворение и модули, необходимые для ES6 и ES7 функций. Например, ждут работы в squelize call, я проверен. Но это не работает для запроса вызова. Зачем?

+0

FYI, 'асинхронного/await' не является частью ES7. Это все еще только предложение. –

+0

См. Мой ответ [здесь] (http://stackoverflow.com/a/38252603/2410379). Кроме того, полезно [this] (https://tc39.github.io/ecmascript-asyncawait/#async-function-definitions). –

ответ

27

Вы должны только await на что-то, что возвращает обещание. Я бы определенно рекомендовал читать на Promises, прежде чем вы начнете работать с async и await. Вы, вероятно, может получить этот пример, чтобы работать, создавая свою собственную функцию-обертку вокруг request, чтобы сделать его вернуть обещание, например, так:

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: В качестве альтернативы, вы можете посмотреть в использовании request-promise вместо обычного модуля запроса.

+1

Это должен быть ответ – felipekm

8

ES6

Использование: Где 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) 
    } 
} 

Код:

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