我怎样才能将callback传递给我传递给“vo”库的生成器?

我想了解callback是如何工作的,所以我创build了一个函数,并且传递了第二个名为“callback”的参数,我使用“callback(arr)”在函数结尾处调用该函数。 不过,我收到一个错误,说:“callback是不是一个function”? 你能告诉我我做错了什么吗?

UPDATE

vo是一个nodejs库,它使用一个生成器函数*()并运行所有的yield。 这基本上是一个处理asynchronous代码,lesscallback的方法(是的,我知道我也使用了callback,但这是一个很好的select)。 一个更受欢迎的图书馆,做同样的事情是合作。 链接到vo: https : //github.com/matthewmueller/vo

var Nightmare = require('nightmare'); var vo = require('vo'); function* MyFunction(query, callback) { arr = []; for (i = 0; i < 1; i++) { arr.push(yield Nightmare({ show: true }).goto(`http://google.com`) .inject('js', 'jquery-3.1.0.js') .evaluate(() => { var title; title = 1 extend = 2 var img; img = 3 var par; par = 4 url = window.location.href; var par_arr = [5, 5, 5, 5]; return { title: title, img: img, par: par, par_arr: par_arr, url: url } }).end() .catch(function(error, nightmare) { console.error('Search failed:', error); })) } callback(arr); return arr; } vo(MyFunction)('query', (arr) => { console.log(arr); }); 

这是在我的环境中工作;

 var vo = require('vo'); function* idMaker(query, params){ for (var i = 0; i < 5; i++) { console.log(query); } params.callback("callback value"); return; } vo(idMaker)("param value",{callback: (value)=>console.log(value)} ); 

输出:

 param value param value param value param value param value callback value 

我现在没有时间读“vo”文档来告诉你为什么,但我在这里看到了一个快速的过程。

vo调用你没有参数给它的函数。 这就是为什么你得到你所得到的错误。

你需要做的是传递一个函数,当被调用的时候会调用MyFunction('query', (arr) => { console.log(arr); })

匿名发生器

你可以这样做:

 vo(function *() { return (yield* MyFunction('query', (arr) => { console.log("callback", arr); })); }).then((arr) => { console.log("then", arr); }); 

使用co-bind

或者如FAQ所示 ,您可以使用co-bind添加以下require

 var cobind = require('co-bind'); 

而上面的代码可以成为:

 vo(cobind(MyFunction, undefined, 'query', (arr) => { console.log("callback", arr); })).then((arr) => { console.log("then", arr); }); 

使用co-bind而不仅仅是做MyFunction.bind是必要的,因为否则, vo不会将该函数视为生成器。

无论您使用匿名生成器还是co-bind ,我得到的输出是:

 callback [ { img: 3, par: 4, par_arr: [ 5, 5, 5, 5 ], title: 1, url: 'https://www.google.com/?gws_rd=ssl' } ] then [ { img: 3, par: 4, par_arr: [ 5, 5, 5, 5 ], title: 1, url: 'https://www.google.com/?gws_rd=ssl' } ] 

这就是说,我没有看到使用callback的任何好处。 我只是在vo之后使用.then()而不将callback传递给MyFunction 但是,即使不传递callback,仍然需要将queryparameter passing给MyFunction ,并可以使用上述方法之一。

 vo(MyFunction)('query', (arr) => { console.log(arr); }); 

这看起来不对 你喂vo MyFunction ,然后大概它返回一个函数,然后用'query'和胖箭头函数作为参数发射。 MyFunction只有当vo返回MyFunction才会起作用,除非它正在做一些修改MyFunction ,否则我们真的需要知道这个vo实际上是在做什么来回答这个问题。