Co密度:Co和co.wrap在Node.js中的行为不同

虽然我有点想通了 Koa 流机制是如何工作的(我认为),但我似乎无法掌握 co 和 co.wrap 之间的所有差异。

"use strict";
var co = require("co");
function ValidationError(message, obj, schema) {
    Error.call(this, "Validation failed with message \"" + message + "\".");
    this.name = "ValidationError";
    this.object = obj;
    this.schema = schema;
}
ValidationError.prototype = Object.create(Error.prototype);
function ValidatorWithSchema(properties, schema) {
    this.properties = properties;
    this.schema = schema;
}
ValidatorWithSchema.prototype.validate = function* (obj) {
    var validatedObj = obj;
    for (let schemaKey in this.schema) {
        validatedObj = yield this.properties[schemaKey](validatedObj, this.schema[schemaKey]);
    }
    return validatedObj;
};
var typeGen = function* (obj, type) {
    console.log("Checking against "+ type.name);
    var primitives = new Map([
        [String, "string"],
        [Number, "number"],
        [Boolean, "boolean"]
    ]);
    if (!((obj instanceof type) || (primitives.has(type) && (typeof obj === primitives.get(type))))) {
        var error = new ValidationError("Given object is not of type " + type.name, obj);
        throw error;
    }
    return obj;
};
var validator = new ValidatorWithSchema({type: typeGen}, {type: String});
var runWrap = r => {
    console.log(r);
    console.log("### WRAP ###");
    var validate = co.wrap(validator.validate);
    validate(11).then(console.log, console.error);
};
co(function* () {
    yield validator.validate(11);
}).then(runWrap, runWrap);

此代码的输出如下:

Checking against String
{ [ValidationError] name: 'ValidationError', object: 11, schema: undefined }
### WRAP ###
11

您可以看到我包装了 co.wrap 的使用,以便它在简单的 co use 之后。现在很明显,typeGen在第二次尝试中没有被调用,但是为什么会这样?这两个结果不应该是相同的吗?

1

这只是非常常见的problem of calling "unbound" methods
您仍然需要在validator实例上调用包装函数作为方法。例如,您可以在validate函数上使用call

var validate = co.wrap(validator.validate);
validate.call(validator, 11).then(console.log, console.error);

或者,您需要.bind()方法:

var validate = co.wrap(validator.validate.bind(validator));
validate(11).then(console.log, console.error);

或者更好的是,只需在其定义点包装生成器函数,以便该方法总是立即返回一个承诺:

ValidatorWithSchema.prototype.validate = co.wrap(function* (obj) {
    …
});
…
validator.validate(11).then(console.log, console.error);

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(145)
程序的正当表现在程序的:Angular应用程序表现怪异
上一篇
Scratch编程简单作品:Bull队列不处理简单作业(bull javascript)
下一篇

相关推荐

  • javascript开发桌面应用从入门到精通

    JavaScript是一种跨平台的脚本语言,可以用来开发桌面应用。它可以在浏览器中运行,也可以在服务器端运行,甚至可以用来开发桌面应用。…

    2023-03-12 12:03:42
    0 14 17
  • javascript可以跨平台吗优势与挑战。

    答:是的,javascript可以跨平台。它可以在多种操作系统和浏览器上运行,如Windows、Mac OS、Linux和Chrome、Firefox等。下面是一个简单的javascript代码示例,用于显示“Hello World”:…

    2023-04-24 12:52:30
    0 96 80
  • react native 样式:```This is a Title```

    React Native 样式是 React Native 应用程序中最重要的部分,它提供了一种方便的方式来为应用程序添加外观和布局。…

    2023-01-30 15:39:38
    0 54 26
  • javascript权威:JavaScript的基本概念

    JavaScript 权威指的是 JavaScript 的标准,也就是 ECMAScript(ECMA-262)。它是由 ECMA 国际组织制定的一种语言标准,它定义了 JavaScript 语言的语法和行为,以及实现 JavaScript 的规范。…

    2023-02-08 09:10:25
    0 28 62
  • javascript对象:利用JavaScript对象实现复杂数据结构

    JavaScript对象是一种无序的集合数据类型,用于存储和检索信息。它由一系列键/值对组成,其中键是一个字符串,而值可以是任何有效的JavaScript数据类型,包括另一个对象。…

    2023-03-08 12:09:06
    0 15 11
  • javascript作用域理解全局作用域、函数作用域和块级作用域

    示例示例作用域指的是代码中定义变量和函数的范围,它决定了在何处可以访问到这些变量和函数。中有两种作用域:全局作用域和局部作用域。…

    2023-01-29 01:03:11
    0 38 10
  • javascript作用:如何利用JavaScript来创建强大的Web应用

    JavaScript是一种轻量级的编程语言,它可以用于创建动态的、交互式的网页和应用程序。它是一种客户端脚本语言,这意味着它可以在用户的浏览器中运行,而无需向服务器发送请求。…

    2023-05-02 11:23:28
    0 99 45
  • javascript的输出语句:使用JavaScript输出结果

    JavaScript的输出语句是指在网页中显示文本或其他内容的语句,常用的输出语句有document.write()、window.alert()和console.log()。…

    2023-05-14 13:12:22
    0 52 44

发表评论

登录 后才能评论

评论列表(17条)