我对像nodejs这样的异步语言很新,我正在尝试编写一个可以访问链接的Web抓取工具,下载代码,使用正则表达式提取,然后使用该链接访问另一个链接码。我知道我可以使用回调,但我希望必须达到8-9级,我认为承诺是要走的路(有更好的方法吗?)
var promise = require("promise");
var request = require("request");
login();
function get_login_code()
{
request.get("someurl.com", function (error, response, body)
{
// just for example
body = 'TOKEN" value="hello world"';
var login_code = body.match(/.TOKEN" value="([^"]+)../i);
return login_code
});
}
function login()
{
var login_promise = promise.resolve(get_login_code());
console.log(login_promise);
}
我已经尝试过一堆搞乱承诺的组合,但我总是得到未定义或没有价值的承诺。我不想在promise中嵌入promise函数,因为这与回调地狱完全相同。有人能告诉我我做错了什么,我真的希望这段代码是程序性的而不是8个回调。在理想世界中promise.resolve
只等到get_login_code()
返回实际代码,而不是未定义。
输出:
Promise { _45: 0, _81: 1, _65: undefined, _54: null }
期望的输出:
hello world
答案 0 :(得分:2)
您的代码所做的事情:
get_login_code
,不返回任何内容(即undefined
)login
函数内部创建一个新的承诺,立即解析为get_login_code
的结果,即undefined
。因此,您根本不使用login_code
。
要使其有效,您应该让get_login_code
返回将被解析为login_code
的承诺。考虑使用promise
npm模块,代码可能如下所示:
// uppercased, it's a constructor
var Promise = require("promise");
var request = require("request");
login();
function get_login_code()
{
return new Promise(function (resolve, reject) {
request.get("someurl.com", function (error, response, body) {
if (err) {
reject(err);
return;
}
// just for example
body = 'TOKEN" value="hello world"';
var login_code = body.match(/.TOKEN" value="([^"]+)../i);
resolve(login_code);
});
});
}
function login()
{
// return a new promise to use in subsequent operations
return get_login_code()
.then(function(login_code) {
console.log(login_code);
});
}
答案 1 :(得分:1)
你应该在函数中创建新的promise来处理拒绝,并且不要通过处理函数本身的解析来解决。然后使用从promise获取响应值。我想这应该有用。
var promise = require("promise");
var request = require("request");
function get_login_code()
{
var promise = new Promise(function(resolve, reject) {
request.get("someurl.com", function (error, response, body)
{
if (error) {
reject(error);
} else {
// just for example
body = 'TOKEN" value="hello world"';
var login_code = body.match(/.TOKEN" value="([^"]+)../i);
resolve(login_code);
}
});
});
}
get_login_code()
.then(function (code) {
console.log(code);
});