0

我正在尝试从异步函数获取 http get 响应。但是在函数中显示值但返回值未定义。

甚至承诺不是未定义的值

请在下面找到代码

'use strict';
const express = require('express');
    var request = require('request');
var https = require('https');

async function getCurrencies() {
    let    response;
    try {


        var getOptions = {
            url: 'http://localhost:3000/api/currency',
            method: 'GET',
            headers: {
                'Content-Type': 'application/json'
            },
            json:true
        };

        await request(getOptions, function (err, res, body) {

            if (res && (res.statusCode === 200 || res.statusCode === 201)) {
        console.log(' response ', res.body.rates.INR);

            return res.body;
            } else {
                console.log('error body ', body);

            }
        });

    } catch (error) {
        console.log(" error pulling ", error);
        process.exit();
    }

}

var tt =  getCurrencies().then(function(value) {
    console.log(' tt values ',value);

}
);

下面是日志

 tt values  undefined
 response 64.945
4

2 回答 2

4

我会重写做这样的事情:

function getCurrencies() {

    return new Promise((resolve, reject) => {
        try {

            var getOptions = {
                url: 'http://localhost:3000/api/currency',
                method: 'GET',
                headers: {
                    'Content-Type': 'application/json'
                },
                json:true
            };

            request(getOptions, function (err, res, body) {

                if (res && (res.statusCode === 200 || res.statusCode === 201)) {
                    console.log(' response ', res.body.rates.INR);
                    resolve(res.body);
                } else {
                    console.log('error body ', body);
                    reject(new Error('Error body: ' + JSON.stringify(body)));
                }
            });

        } catch (error) {
            console.log(" error pulling ", error);
            process.exit();
        }
    });
}

getCurrencies().then(function(value) {
    console.log(' tt values ',value);
});

你也可以做一些更紧凑的事情:

const rp = require('request-promise');
function getCurrencies() {

    var getOptions = {
        url: 'http://localhost:3000/api/currency',
        method: 'GET',
        headers: {
            'Content-Type': 'application/json'
        },
        json:true,
        resolveWithFullResponse: true 
    };

    return rp(getOptions).then((response) => {
        return response.body;
    });
}

getCurrencies().then(function(value) {
    console.log(' tt values ',value);
}).catch ((err) => {
    console.error('An error happened: ' + err);
});
于 2018-03-10T22:26:20.947 回答
0

request模块/函数不返回 aPromise所以你不能使用await. 你有两个选择:

  1. 使用标准节点回调模式,或
  2. request-promise-native如果您坚持使用async/await模式,请切换到 eg模块
于 2018-03-10T22:16:56.957 回答