Запустите request.post асинхронно в приложении js узла - PullRequest
0 голосов
/ 30 мая 2018

Я знаю, что раньше было много подобных вопросов, но я пробовал каждый из них, и все еще получаю эту конкретную проблему в каждой попытке.Так что я делаю, у меня есть файл с именем data.js, который содержит функцию, которая извлекает данные json из web api и возвращает проанализированную строку Json.У меня есть другой файл, который вызывает эту функцию, и я просто пытаюсь отладить результат на консоли.Но каждый раз, когда я запускаю функцию, я получаю «undefined» на консоли, то есть код выполняется асинхронно, а значение возвращается даже до его извлечения.Вот мой код:

data.js

module.exports = {

    holidays: function(x,y,z)
    {

        function intialize()
        {

            return new Promise(function(resolve, reject) {
                    Request.post({
                    "headers": { "content-type": "application/json" },
                    "url": //someurl,
                    "body": JSON.stringify({//some input})
                }, function(err, resp, body) {
                    if (err)
                    {
                        reject(err);
                    } 
                    else
                    {
                        resolve(JSON.parse(body));
                    }
                })
            })

        }

        var Request = require("request");
        var json_content="";
        var req = intialize();

        req.then(function(result) {
            console.log(result);//getting correct answer here
            json_content=result;
            //I know I've to return the value somewhere here but how do i do it
        }, function(err) {
             console.log(err);
        });

        return(json_content);
    }
};

Код в вызывающей функции:

var h= require(__dirname+'/data.js');
console.dir(h.holidays('x','y','z'));//getting undefined

Ответы [ 2 ]

0 голосов
/ 30 мая 2018
module.exports = {

    holidays: function(x,y,z)
    {

        function intialize()
        {

            return new Promise(function(resolve, reject) {
                    Request.post({
                    "headers": { "content-type": "application/json" },
                    "url": //someurl,
                    "body": JSON.stringify({//some input})
                }, function(err, resp, body) {
                    if (err)
                    {
                        reject(err);
                    } 
                    else
                    {
                        resolve(JSON.parse(body));
                    }
                })
            })

          }
        }
        var Request = require("request");
        var json_content="";

        return new Promise(function(resolve, reject) {     
           intialize()
          .then(function(result) { 
                 resolve(result);
          })
          .catch(function(err) {
            reject(err);
          });
        });
};

И вы должны получить ответ как

var h= require(__dirname+'/data.js');
h.holidays('x','y','z').then(function(res) {
    console.log(res)
})
0 голосов
/ 30 мая 2018

это очень просто.Вы должны использовать функции обратного вызова для получения результатов.

module.exports = {
  holidays: function(x,y,z,callback){
    function intialize()
    {
      return new Promise(function(resolve, reject) {
        Request.post({
            "headers": { "content-type": "application/json" },
            "url": //someurl,
            "body": JSON.stringify({ })
        },
          function(err, resp, body) {
            if (err)
            {
                reject(err);
            }
            else
            {
                resolve(JSON.parse(body));
            }
            })
        })
    }
    var Request = require("request");
    var json_content="";
    var req = intialize();

    req.then(function(result) {
        console.log(result);
        json_content=result;
        callback(json_content); // sending response from here via callback variable
    }, function(err) {
         console.log(err);
    });
        return(json_content);
  }
};

И вы должны получить ответ типа

var h= require(__dirname+'/data.js');
h.holidays('x','y','z',function(res){
    console.log(res);
})
...