我怎样才能将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,仍然需要将query
parameter passing给MyFunction
,并可以使用上述方法之一。
vo(MyFunction)('query', (arr) => { console.log(arr); });
这看起来不对 你喂vo
MyFunction
,然后大概它返回一个函数,然后用'query'
和胖箭头函数作为参数发射。 MyFunction
只有当vo返回MyFunction
才会起作用,除非它正在做一些修改MyFunction
,否则我们真的需要知道这个vo
实际上是在做什么来回答这个问题。