在nodejs

时间:2017-01-11 06:27:27

标签: node.js promise

我对像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

2 个答案:

答案 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);
});