如何将回调传递给传递给 "vo" 库的生成器?
How can I pass a callback to a generator that I pass to the "vo" library?
我试图了解回调的工作原理,因此我创建了一个函数并传递了第二个名为 'callback' 的参数,我在函数末尾使用 'callback(arr)' 调用它。但是我收到一条错误消息:"callback is not a function"?你能告诉我我做错了什么吗?
更新
vo 是一个 nodejs 库,它采用生成器函数* () 并运行它的所有 yields 。它基本上是一种使用较少回调处理异步代码的方法(是的,我知道我也使用了回调,但这几乎是一个选择)。做完全相同事情的一个更流行的库是 co。 Link 发给: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);
});
vo(MyFunction)('query', (arr) => {
console.log(arr);
});
这看起来不对。你正在喂 vo
MyFunction
然后大概它 returns 一个函数你然后用 'query'
和粗箭头函数作为参数。 MyFunction
只有在 vo 返回 MyFunction
时才有效,这有点愚蠢,除非它正在做一些修改 MyFunction
的事情,在这种情况下我们真的需要知道到底是什么 vo
其实是为了回答这个问题而做的
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 suggests,你可以使用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' } ]
话虽如此,我认为使用回调没有任何好处。我会在 vo
之后使用 .then()
而不将回调传递给 MyFunction
。 但是即使你不传递回调,你仍然需要传递 query
参数为 MyFunction
,并且可以使用上述方法之一。
这在 my enviroment 中有效;
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' 文档来告诉你原因,但我看到了一个示例 here。
我试图了解回调的工作原理,因此我创建了一个函数并传递了第二个名为 'callback' 的参数,我在函数末尾使用 'callback(arr)' 调用它。但是我收到一条错误消息:"callback is not a function"?你能告诉我我做错了什么吗?
更新
vo 是一个 nodejs 库,它采用生成器函数* () 并运行它的所有 yields 。它基本上是一种使用较少回调处理异步代码的方法(是的,我知道我也使用了回调,但这几乎是一个选择)。做完全相同事情的一个更流行的库是 co。 Link 发给: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);
});
vo(MyFunction)('query', (arr) => {
console.log(arr);
});
这看起来不对。你正在喂 vo
MyFunction
然后大概它 returns 一个函数你然后用 'query'
和粗箭头函数作为参数。 MyFunction
只有在 vo 返回 MyFunction
时才有效,这有点愚蠢,除非它正在做一些修改 MyFunction
的事情,在这种情况下我们真的需要知道到底是什么 vo
其实是为了回答这个问题而做的
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 suggests,你可以使用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' } ]
话虽如此,我认为使用回调没有任何好处。我会在 vo
之后使用 .then()
而不将回调传递给 MyFunction
。 但是即使你不传递回调,你仍然需要传递 query
参数为 MyFunction
,并且可以使用上述方法之一。
这在 my enviroment 中有效;
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' 文档来告诉你原因,但我看到了一个示例 here。