登录
注册
node.js 学习社区
如何用co包装http.get函数?为什么执行出错?

撸阿

2015-01-24 15:54

我想试试node 0.11的ES6 生成器特性,照网上例子写了一个,高阶函数和co调用都有了:

var http = require('http');
var co = require('co');

function getHttp(url) {
    return function (callback) {
        http.get(url, callback);
    }
}

function test(){
    co(function *(){
        var p1 = yield getHttp("http://www.baidu.com/");
        console.log(p1);
    }).catch(function(err){
        console.log(err.stack);
    })();
}
test();
但是总报错:object is not a function


这是为什么?求指教

回复 · 2

  • 通过你的代码看来,有两个问题:

    1. co就是一个生成器函数function*()的执行容器,接受一个function*()的函数体做为参数,不需要再加()表示调用
    2. 如果yield是以类Thunk的高阶函数存在,如你代码中的getHttp,那么默认这个callback需要形如callback(err[,res,res2...]),因为co就是这么回调它的(node风格的函数第一个参数都表示错误,如果没有错误传null即可

    那么,你的代码改成这样就OK了(可以看到getHttp里的默认回调被转换成co需要的回调形式(err,res):

    var http = require('http');
    var co = require('co');
    
    function getHttp(url) {
        return function (callback) {
            http.get(url, function(res){
                callback(null, res);
            });
        }
    }
    
    function test(){
        co(function *(){
            var p1 = yield getHttp("http://www.baidu.com/");
            console.log(p1);
        }).catch(function(err){
            console.log(err.stack);
        });
    }
    test();

    2

  • 1

发表回复

你可以在回复中 @ 其他人