【问题标题】:Run request.post asynchronously in node js application在 node js 应用程序中异步运行 request.post
【发布时间】:2018-11-08 22:18:33
【问题描述】:

我知道以前有很多类似的问题,但我已经尝试了每一个,但每次尝试仍然遇到这个特定问题。所以我正在做的是我有一个名为 data.js 的文件,其中包含一个从 web api 获取 json 数据并返回 Json 解析字符串的函数。我有另一个调用此函数的文件,只是我试图在控制台上调试结果。但是每次我运行该函数时,我都会在控制台上得到“未定义”,即代码是异步运行的,并且在获取之前就返回了值。 这是我的代码:

数据.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

【问题讨论】:

标签: node.js promise request async-await node-modules


【解决方案1】:
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)
})

【讨论】:

    【解决方案2】:

    它非常简单。您必须使用回调函数来获取结果。

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

    【讨论】:

    • 不工作,回调行抛出错误 - UnhandledPromiseRejectionWarning : ReferenceError : 回调未定义
    • 对不起,我忘了在函数参数中添加回调,现在可以工作了,非常感谢
    • 很高兴为您提供帮助 :)
    • 我有一个小小的疑问,有什么方法可以让执行流程在该位置停止,直到它被处理。因为,在上述解决方案中,如果我在 h.holidays(....) 行之后编写一些命令,下一行将首先执行,而不是 h.holidays(...) 行。诸如等待之类的东西?
    • 您可以使用Async。在你的情况下,我认为 async 的 waterfall 方法会很有用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 2018-11-24
    • 1970-01-01
    • 2016-11-28
    • 2013-10-03
    • 1970-01-01
    • 2015-07-24
    相关资源
    最近更新 更多