问候,即时开发一个简单的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回复。 任何想法怎么做?
答案 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)
})
这样你就不会混合样式,使代码更具可读性和可维护性。