Новый результат Promise, возвращающий слова "Promise {}" - PullRequest
0 голосов
/ 09 мая 2018

Я работаю в коде с Promise, чтобы получить значения JSON, код работает, но вывод всегда возвращается между словами Promise {}.

const info = new Promise((resolve, reject) => {

    var req = require('request');


    var options = {
        url: 'https://api.info.com/',
        headers: {
            'User-Agent': 'request'
        }
    };
    req(options, function (err, response, body) {
        if (!err && response.statusCode === 200) {
            resolve(JSON.parse(body));

        }
    });
});
console.log(info); //Output: Promise { [ { name: 'Gary'}, { name: 'John'} ] }

Что я делаю не так?

Мне бы хотелось, чтобы мой вывод был только как на сайте:

[ { name: 'Gary'}, { name: 'John'} ]

==> ОБНОВЛЕНИЕ Это работает частично:

const info = new Promise((resolve, reject) => {

    var req = require('request');


    var options = {
        url: 'https://api.info.com/',
        headers: {
            'User-Agent': 'request'
        }
    };
    req(options, function (err, response, body) {
        if (!err && response.statusCode === 200) {
             resolve(JSON.parse(body));

         }
    });
});
info.then(function(value) {console.log(value)});//output: [ { name: 'Gary'}, { name: 'John'} ]

но мне нужно использовать результат за пределами , а затем , чтобы выполнить другие операции с запросами, используя этот результат Json, я попробовал что-то подобное:

info.then(function(value) { jsonfile = value });
console.log(jsonfile);//Output: jsonfile is not defined

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Вы console.logging объект обещания. Если вы хотите получить данные из действия разрешения, вы можете связать функцию, которая использует эти данные. пример:

const info = new Promise((resolve, reject) => {

    var req = require('request');


    var options = {
        url: 'https://api.info.com/',
        headers: {
            'User-Agent': 'request'
        }
    };
    req(options, function (err, response, body) {
        if (!err && response.statusCode === 200) {
            resolve(JSON.parse(body));

        }
    });
});
//On resolve, perform some function to the returned value (This can be replaced with a function call)
info.then(function(value) {console.log(value)});

Дополнительные примеры и подробности можно найти на https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises

Изменить в ответ на комментарий (у меня нет представителя, чтобы публиковать комментарии): Обещания являются синхронными, в то время как код не в обещании или then () не обрабатывается синхронно. Это стоит упомянуть, потому что, хотя вы могли бы подписать свое значение в глобальной переменной или определить переменную var 'value' перед обещанием, 'value', возможно, еще не было разрешено обещанием, то есть вы ввели состояние гонки. Вместо этого, если вам нужны данные из вашего обещания в другой функции (они должны запускаться последовательно), эта функция должна вызываться в вашем then ().

Пример:

info.then(function(value){
otherfunction(value);
});

function otherfunction(val) {
//does whatever you need to value and will occur after the promise above resolves
}
0 голосов
/ 09 мая 2018

info является ожидающим обещанием. Вам нужно await использовать .then на нем

Пример кода

const info = new Promise((resolve, reject) => {

  var req = require('request');


  var options = {
    url: 'http://httpbin.org/get',
    headers: {
      'User-Agent': 'request'
    }
  };
  req(options, function (err, response, body) {
    if (!err && response.statusCode === 200) {
      resolve(JSON.parse(body));

    }
  });
});
console.log(info); // Promise { <pending> }
info.then((result) => console.log(result)); // api result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...