Promises和nodejs的具体示例(并没有解决方案)

时间:2016-01-05 23:33:51

标签: javascript node.js promise bluebird

所以我想通过尝试使用nodejs来实现一个常见的用例来了解更多有关Promises的信息(我随意选择了Bluebird,尽管有简洁的'文档):

我在文件中有大约9000个左右的URL,还有一些空行。我想:

  • 过滤掉空行(url.length< = 0)
  • 过滤那些不再响应的内容(通过使用override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("customCell", forIndexPath: indexPath) as! CustomCell cell.customCellDescription.text = data[indexPath.row] return cell } 模块的HEAD请求)
  • MAP通过request
  • 获取IPv4地址
  • MAP使用该IPv4地址和http://ipinfo.io/xx.xx.xx.xx/geo获取地理数据(好的,是的,每天有API限制,但让我们假设我可以)
  • 将结果信息作为JSON对象数组写入新文件
  • 当然可以从并行运行这一事实中获益,因此比顺序执行要快得多

第一个过滤器很容易,因为它立即返回(这里使用Bluebird):

dns.resolve()

但是如何将异步头请求的结果反馈回Promise?这是另一个更完整的例子,说明我在哪里撞墙(见内联评论):

Promise.each(urls, function(value, index, length) {
  return value.length > 0;
}).then(
  console.log(urls);
);

对于我计划修改的<pre class="prettyprint lang-js"> var Promise = require('bluebird'), request = Promise.promisifyAll(require('request')); var urls = ["", "https://google.com/", "http://www.nonexistent.url"]; var checkLength = function(url) { return Promise.resolve(url.length > 0); } var checkHead = function(url) { return Promise.resolve( // ??? seee below for an 'unPromised' function that works on its own ) } var logit = function(value) { console.log((urls.length - value.length) + " empty line(s)"); } Promise .filter(urls, checkLength) // and here? .filter(urls, checkHead) ? I don't think this would work. // and I haven't even look at the map functions yet, although I guess // that once I've understood the basic filter, map should be similar. .then(logit); </pre> 函数:

checkHead

我不想抱怨,我仍然拼命寻找一些好的教程介绍材料,让那些不熟悉Promise的开发人员亲自动手,并展示常见用例的实际实现,类似于cookbook。如果有的话,我很乐意得到一些指示。

1 个答案:

答案 0 :(得分:1)

过滤器和贴图函数的工作方式类似于JavaScript数组的默认函数。

之前我曾使用过prom的请求,并且只有一个特定的模块用于此请求 - 承诺。它可能更方便。

我觉得请求承诺模块非常适合展示Promise是如何伟大的。

而不是陷入回调地狱,而每次添加的请求都会更深入,你可以使用promises来代替这个

rp(login)
.then(function(body) {
    return rp(profile);
})
.then(function(body) {
    return rp(profile_settings);
})
.then(function(body) {
    return rp(logout);
})
.catch(function(err) {
    // the procedure failed
    console.error(err);
});

我将您当前的代码改写为此

var Promise = require("bluebird");
var rp = require("request-promise");

var urls = ["", "https://google.com/", "http://www.nonexistent.url"];

Promise
    // checkLength
    .filter(urls, function(url){return url.length > 0})
    .then(function(list) {
        // logit
        console.log((urls.length - list.length) + " empty line(s)");

        // checkHead
        return Promise.filter(list, function(url) {
            // using request-promise and getting full response
            return rp.head({ uri: url, resolveWithFullResponse: true })
                .promise().then(function(response) {
                    // only statusCode 200 is ok
                    return response.statusCode === 200;
                })
                .catch(function(){
                    // all other statuscodes incl. the
                    // errorcodes are considered invalid
                    return false;
                });
        })
    })
    .then(console.log);