Обещание возвращает неправильное значение - PullRequest
0 голосов
/ 01 июля 2018

В моем коде я пытаюсь присвоить значение переменной json, чтобы вернуть его после (потому что я не могу вернуть его из функции anon.).

Поскольку моя функция асинхронная, потому что она отправляет запросы (может, кто-то знает, как сделать ее синхронизированной? Я не планировал делать ее асинхронной), я добавил await перед запросом (https.get).

Я пытался получить значение из Обещания, но оно всегда undefined, хотя я ожидал асинхронную функцию.

Вот код:

async function get_users() {
    const https = require('https');
    var token = '...';
    var json = undefined;

    await https.get('...', (resp) => {
        let data = '';

        resp.on('data', (chunk) => {
            data += chunk;
        });

        resp.on('end', () => {
            json = JSON.parse(data)['response']['items'];
        });
    }).on("error", (err) => {
        console.log("Error: " + err.message);
    });

    return json;
}

get_users().then(function(result) {
    console.log(result);
});

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Возвращает Promise и resolve это, когда вызывается событие end, в противном случае reject это в случае ошибки:

async function get_users() {
  const https = require('https');
  const token = '...';

  return new Promise((resolve, reject) => {
    https.get('...', resp => {
      let data = '';

      resp.on('data', chunk => {
        data += chunk;
      });

      resp.on('end', () => {
        let json;

        try {
          json = JSON.parse(data)['response']['items'];          
        } catch (e) {
          reject(e);
        };
        resolve(json);
      });
    }).on("error", err => reject(err));
  });
}

get_users().then(result => console.log(result));
0 голосов
/ 01 июля 2018

Пожалуйста, обратитесь к моему приведенному ниже коду. У меня тоже были проблемы с получением ответов от Promises. Но я наконец-то заставил его работать. Вот код:

var output;
var rp = require('request-promise-native');
var myJSONObject = {
  "inputs": [{
    "name": "<name>",
    "value": < value >
  }]
};
var orchName = 'TEST05';
postData = JSON.stringify(myJSONObject);
return networkCall(postData, orchName).then((response) => {
  console.log('response is' + response)

}).catch((response) => {
  console.log(`ERROR: ` + response);
});

function networkCall(postData, orchName) {
  return new Promise((resolve, reject) => {
    var options = {
      method: 'post',
      uri: '<URL>',
      body: postData,
      auth: {
        'user': 'usr',
        'pass': 'pwd'
      },
      json: true
    };
    return rp(options)
      .then(body => {
        var response = body;
        resolve(response);
      })
      .catch(err => {
        console.log('FAILED' + err);
        reject(err);
      });
  });
}

Таким образом, ваш код может выполняться в синхронном потоке. Если возвращаемое значение равно undefined, то, вероятно, могло произойти то, что вызывающая функция завершила бы выполнение даже до того, как вызываемая функция вернула свой ответ. подход будет работать просто отлично.

...