我试图了解回调是如何工作的,所以我创建了一个函数并传递了第二个名为' callback'的参数,我在函数的末尾调用了回调(arr)& #39; 。但是我收到的错误是:"回调不是函数" ?你能告诉我我做错了吗?
更新
vo是一个nodejs库,它接受一个生成器函数*()并运行它的所有产量。它基本上是一种处理异步代码并减少回调的方法(是的,我知道我也使用了回调,但这几乎是一个选择)。一个更受欢迎的图书馆做同样的事情是co。链接到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);
});
答案 0 :(得分:0)
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' } ]
这就是说,我没有看到使用回调有任何好处。我会在.then()
之后使用vo
,而不会将回调传递给MyFunction
。但即使您没有通过回调,您仍需要传递query
参数MyFunction
,可以使用上述方法之一。
答案 1 :(得分:0)
这适用于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'文档告诉你为什么,但我看到了一个exaplme here。
答案 2 :(得分:-2)
vo(MyFunction)('query', (arr) => {
console.log(arr);
});
这看起来不错。您正在提供vo
MyFunction
,然后可能会返回一个函数,然后使用'query'
并使用胖箭头函数作为args。 MyFunction
仅在vo返回MyFunction
时才有效,除非它正在修改MyFunction
,否则我会真的需要知道什么是vo
实际上是为了回答这个问题。