最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - "cannot read property 'then' of undefined", despite returning a Promise - Stack O

programmeradmin0浏览0评论

I'm facing what seems to be a mon problem, however, I really cannot figure out how to solve it.

I'm calling a function with makes a GET request, parses the returned JSON, and then (supposedly) returns a Promise, which I use to print the parsed JSON data. However, I am getting the error described in the title of this question when I try to do so. I have two files that I'm using. The first simply calls a function from the second, and tries to print the return value (and gets the error).

First file:

var secondFile = require('./test');
secondFile.testFunc("some stuff").then(function(res) {
    console.log(res);
})

Second file (test.js):

module.exports = {
    testFunc : function(address) {
        var params = {
            q: address,
            format: "json"
        }
        var baseUrl = "";
        rp({url: baseUrl,
            qs: params,
            method: "GET"})
            .then(function(body) {
                var parsedBody = JSON.parse(body);
                var result = {one: parsedBody[0], two: parseBody[1]};
                return new Promise(function(resolve, reject) {
                    resolve(result);
                });
            }).catch(function(err) {
                console.log(err);
            });
    }
}

Any help is greatly appreciated.

I'm facing what seems to be a mon problem, however, I really cannot figure out how to solve it.

I'm calling a function with makes a GET request, parses the returned JSON, and then (supposedly) returns a Promise, which I use to print the parsed JSON data. However, I am getting the error described in the title of this question when I try to do so. I have two files that I'm using. The first simply calls a function from the second, and tries to print the return value (and gets the error).

First file:

var secondFile = require('./test');
secondFile.testFunc("some stuff").then(function(res) {
    console.log(res);
})

Second file (test.js):

module.exports = {
    testFunc : function(address) {
        var params = {
            q: address,
            format: "json"
        }
        var baseUrl = "http://google.";
        rp({url: baseUrl,
            qs: params,
            method: "GET"})
            .then(function(body) {
                var parsedBody = JSON.parse(body);
                var result = {one: parsedBody[0], two: parseBody[1]};
                return new Promise(function(resolve, reject) {
                    resolve(result);
                });
            }).catch(function(err) {
                console.log(err);
            });
    }
}

Any help is greatly appreciated.

Share Improve this question asked Feb 26, 2017 at 0:35 Miki PMiki P 6521 gold badge9 silver badges22 bronze badges 7
  • 2 FYI, return new Promise(function(resolve, reject) {resolve(result);}); can be replaced with return result;. Inside a .then() handler, you can just return a value and that will bee the resolved value of the parent promise. – jfriend00 Commented Feb 26, 2017 at 0:39
  • Thanks! That does make it a bit nicer to read. – Miki P Commented Feb 26, 2017 at 0:54
  • In cases where you do need to return a resolved promise, you can also do return Promise.resolve(result);, though that is not needed here. – jfriend00 Commented Feb 26, 2017 at 1:45
  • @jfriend00 I'm wondering if it would somehow be possible to call testFunct, then call it again, and then use the results of both functions after they've resolved. – Miki P Commented Feb 26, 2017 at 2:40
  • Yea, get two promises, then use Promise.all([p1, p2]).then(results => { console.log(results)}); Promise.all() tracks all the promises you pass it and call's it's .then() handler when they have all finished and gives you an array of results in the order you passed the promises. – jfriend00 Commented Feb 26, 2017 at 3:34
 |  Show 2 more ments

1 Answer 1

Reset to default 6

testFunc doesn't have a return statement, so it returns undefined.

If you want to take the return value of rp (which appears to be a promise) and then return that from testFunc then you need to add a return statement.

    return rp({url: baseUrl,

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论