【问题标题】:IIFE returns map function, map can't use varIIFE返回map函数,map不能使用var
【发布时间】:2019-08-21 21:11:59
【问题描述】:

我有一个要在地图操作中使用的函数,它将一个局部变量与从地图返回的文档进行比较。我直接试了,我把它当成IIFE试了,两种方式都抱怨map找不到名为boatNumber的变量:

   var mymap = (function() {
        var boatNumber = $('#add_result_boat_number').val();
        return function(doc) {
            if (doc.boatnumber == boatNumber) {
                emit(doc._id, {boatClass: doc.boatClass, p1name: doc.p1name, p2name: doc.p2name});
            }
        }
    })();

    ro.pdb.query(mymap).then(function(response) {
        var results = response.rows;
        // do stuff later
    }).catch(function(error) {
        ro.reporter(error);
    });

如果我将boatNumber 替换为== 中的常量,则效果很好。那么如何让boatNumber在map函数中被识别呢?

更新

Error messages are:
The user's map/reduce function threw an uncaught error.
You can debug this error by doing:
myDatabase.on('error', function (err) { debugger; });
Please double-check your map/reduce function.

紧随其后

ReferenceError: "boatNumber is not defined"
    anonymous file:///Users/ptomblin/Dropbox/KayakResults/js/pouchdb-7.1.1.min.js line 7 > Function:5
    Zn file:///Users/ptomblin/Dropbox/KayakResults/js/pouchdb-7.1.1.min.js:7
    n file:///Users/ptomblin/Dropbox/KayakResults/js/pouchdb-7.1.1.min.js:7
    e file:///Users/ptomblin/Dropbox/KayakResults/js/pouchdb-7.1.1.min.js:7

【问题讨论】:

  • 错误信息到底是什么? boatNumber 肯定在您显示的代码中使用的任何地方的范围内。
  • @RobinZigmond 更新有问题。
  • 我确实感觉mymap 被字符串化,发送到其他地方,并在那里进行评估。我想它必须是纯的

标签: javascript closures pouchdb iife


【解决方案1】:

传递给query 的函数被字符串化并发送到数据库。然后在那里进行评估。因此你不能从外部访问任何东西,它必须是纯的,所以换句话说你只能访问传递的docbuiltin methods(是的,文档应该真的提到这一点)。

看起来,你想做的事可以用普通的find()query 轻松完成:

    var boatNumber = $('#add_result_boat_number').val();
    ro.pdb.find({
     selector: {
       boatnumber: boatNumber,
     },
     fields: ["boatClass", "p1name", "p2name"]
    }).then(...)

【讨论】:

  • 文档说明我需要为此安装另一个插件。我希望避免使这比我不得不做的更复杂。 (顺便说一句,发现这是一个 PouchDB 问题,尽管我忘了标记它)。
  • 嗯,到目前为止,我只使用了 MongoDB(查询深受其启发),但 IMO 很奇怪,您必须加载另一个库进行查询。我的意思是这就是数据库的全部内容......但是在很多条目上运行一些 JS 似乎在性能方面是一个非常糟糕的主意,所以我真的会尝试以某种方式使用真正的数据库查询
  • 它必须是纯粹的并且不能关闭任何东西
  • @bergi with "pure" 我的意思是“除了环境提供的参数和内置函数之外什么都不能访问”(我不得不翻阅大量文档才能找到 nothing.
  • 哦,安装 pouchdb-find 的说明是错误的:npm install pouchdb-find 返回 ENOTFOUND。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-09
  • 1970-01-01
  • 2020-08-17
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多