NodeJS等待API响应

时间:2016-01-17 18:55:46

标签: node.js

简介

问候,即时开发一个简单的NodeJS应用程序以获得乐趣,我需要的一个关键功能是使用goo.gl缩短URL。

我找到了一个工作正常并且我非常满意的软件包,但是我需要将结果(缩短的url)作为json公开给用户。

问题

问题是,一旦我调用短函数,它就不会返回链接,因为它不会等待它完成请求,而是继续。

代码

var googl = require('goo.gl')

module.exports = {
googl: function(link) {

    if (!process.env.GOOGLKEY) {
        return JSON.stringify({
            status: false,
            message: 'No API Key set for goo.gl'
        })
    };

    googl.setKey(process.env.GOOGLKEY)

    googl.shorten(link).then(function(url) {
        return {
            message: url
        }
    }).catch(function(err) {
        console.log(err)
    })



}
}

如您所见,googl.shorten(link).then()不会返回任何内容。

如果我尝试执行var resp = googl.shorten(link).then()之类的操作,然后返回resp,我得到的只是pending

我需要做的是等到goo.gl回复。 任何想法怎么做?

2 个答案:

答案 0 :(得分:0)

var googl = require('goo.gl')

module.exports = {
    googl: function(link, callback) {

        if (!process.env.GOOGLKEY) {
            return JSON.stringify({
                status: false,
                message: 'No API Key set for goo.gl'
            })
        };

        googl.setKey(process.env.GOOGLKEY)

        googl.shorten(link).then(function(url) {
            callback.call(url); //this is the function that you pass as an argument and is executed when you google answers
        }).catch(function(err) {
            console.log(err);
        })
    }
};

为了使用它,您可以这样做

googl('URL_TO_TRANSFORM_HERE', function(url) { //By the way, this is your googl function, not the other that you require.
    console.log('Retrievend asynchronoysly this url : ' + url);
});

答案 1 :(得分:0)

虽然回调方法可以正常工作,但在这种情况下我会建议返回promise,因为它已经使用promises实现了。

您所要做的就是将承诺移出您的模块。 e.g。

//////////////////////////////////////////
// myshortener.js
var googl = require('goo.gl')

module.exports = {
    googl: function(link) {

    if (!process.env.GOOGLKEY) {
        return JSON.stringify({
            status: false,
            message: 'No API Key set for goo.gl'
        })
    };

    googl.setKey(process.env.GOOGLKEY)

    return googl.shorten(link)
       // ---------------------------------
       // MOVE .then() FROM MODULE HERE ...
       // ---------------------------------
}

将promise转移到客户端代码中,如下所示:

//////////////////////////////////////////
// main.js
var shortener = require('myshortener')

shortener.googl(link)
   // ---------------------------------
   // ... TO CLIENT CODE HERE
   // ---------------------------------
       .then(function(url) {
           return {
               message: url
           }
       })
       .catch(function(err) {
           console.log(err)
       })

这样你就不会混合样式,使代码更具可读性和可维护性。