在节点js应用程序

时间:2018-05-30 07:01:23

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

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

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 :(得分: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);
})

答案 1 :(得分:1)

// Child.js
...
componentDidMount() {
  const { register } = this.props
  register(this.verify)
}

verify(values) {
  const { hash, verify } = this.props
  return { [hash]: verify(values[hash], values) }
}
...

// Parent.js
constructor(props)
  super(props)
  this.tests = [] 
  this.state = { 
    value: null, 
    // other initial state
  }
  ...
}

register(verifyFunc) {
  this.tests.push(verifyFunc)
}

render() {
  const { value } = this.sate
  let result = {}
  this.tests.forEach(test => result = { ...result, ...test(value) })
  return (
    <Provider 
      value={{
        ...this.state,
        verificationResults: result,
        register: this.register,
        // other things...
     }}
    >
      {this.props.children}
    </Provider>
  )
}

你必须得到像

这样的回复
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);
          });
        });
};