7

我试图了解回调是如何工作的,所以我创建了一个函数并传递了第二个名为 'callback' 的参数,我在函数末尾使用 'callback(arr)' 调用它。但是我收到一条错误消息:“回调不是函数”?你能告诉我我做错了什么吗?

更新

vo 是一个 nodejs 库,它接受一个生成器函数* () 并运行它的所有 yield 。它基本上是一种使用较少回调来处理异步代码的方法(是的,我知道我也使用了回调,但这几乎是一种选择)。做同样事情的更流行的库是 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);
});
4

3 回答 3

0

这在我的环境中工作;

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”文档来告诉你原因,但我在这里看到了一个例子。

于 2016-09-13T10:36:25.930 回答
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

或者按照常见问题解答的建议,您可以使用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()aftervo而不将回调传递给MyFunction. 但是即使不传递回调,仍然需要将query参数传递给MyFunction,并且可以使用上述方法之一。

于 2016-09-06T19:13:14.550 回答
-2
vo(MyFunction)('query', (arr) => {
    console.log(arr);
});

这看起来不对。你正在喂食vo MyFunction,然后它可能会返回一个函数,然后你用它触发,'query'而胖箭头函数作为 args。MyFunction只有当 vo 返回时才会起作用MyFunction,这有点愚蠢,除非它正在做一些修改MyFunction,在这种情况下,我们真的需要知道到底在vo做什么才能回答这个问题。

于 2016-09-05T14:40:04.590 回答