javascript - 从 Meteor.method 中的回调返回值

标签 javascript asynchronous callback meteor undefined

我遇到了一些我不了解 Meteor 的问题。我有这个方法,它接受一个查询,将它发送到亚马逊,然后在该函数的回调中我尝试返回结果。

Meteor.methods({
    'search': function(query) {
        var bookInfo;
        if (Meteor.isServer) {
            amazon.execute('ItemSearch', {
                'SearchIndex': 'Books',
                'Keywords': query,
                'ResponseGroup': 'ItemAttributes'
            }, function(results) {
                bookInfo = results;
                console.log(bookInfo);
                return bookInfo;
            });
        }
    }
});

但是当我将以下内容放入浏览器 (chrome) 的控制台时:

Meteor.call('search', 'harry potter', function(error, response) {
    console.log('response:', response);
});

我明白了:

undefined
response: undefined          VM13464:3

我想我明白第一个未定义来自客户端没有返回任何东西的方法,但回调似乎根本不起作用。

amazon.execute(...) 肯定会返回一些东西,因为返回上方的 console.log 确实记录了我正在寻找的信息。

有什么问题吗?我该如何解决?

最佳答案

您需要使用Future 来实现您的目标。

从 Meteor 0.6 开始如何使用 future?

Meteor.startup(function () {
 Future = Npm.require('fibers/future');

 // use Future here
}

用 Future 重写的方法:

Meteor.methods({
 'search': function(query) {

    var future = new Future();

    amazon.execute('ItemSearch', {
            'SearchIndex': 'Books',
            'Keywords': query,
            'ResponseGroup': 'ItemAttributes'
    }, function(results) {
       console.log(results);

       future["return"](results)

    });

    return future.wait();
 }
});

现在它应该可以工作了。

Meteor.call('search', 'harry potter', function(error, response) {
   if(error){
    console.log('ERROR :', error);
   }else{
    console.log('response:', response);
   }

});

如果您想了解更多关于Future 库的信息,我建议您观看 screencast


2017 年 12 月 26 日更新

我只是想更新这个答案,因为您可以使用 promise 实现同样的事情,因此摆脱“fibers”依赖 :)

一个例子胜过一千个字

import scrap from 'scrap';

Meteor.methods({
    'hof.add'(el) {
        check(el, {
            _link: String
        });

        const promise = getHofInfo(el._link)
            .then((inserter) => {
                inserter.owner = Meteor.userId();
                Hof.insert(inserter);
                return true;
            })
            .catch((e) => {
                throw new Meteor.Error('500', e.message);
            });
        return promise.await();
    }
});


function getHofInfo(_link) {
    return new Promise((resolve, reject) => {
        scrap(_link, function (err, $) {
            if (err) {
                reject(err);
            } else {
                const attakers = $('#report-attackers').find('li').text();
                const defender = $('#report-defenders').find('li').text();
                const _name = attakers + ' vs ' + defender;
                const _date = new Date();
                resolve({ _name, _date, _link });
            }
        });
    });
}

关于javascript - 从 Meteor.method 中的回调返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20088876/

相关文章:

c# - 我如何在 C# 中编写一个方法,一旦条件为真就返回?

android - 如何知道同步何时完成?

javascript - 使用 map 功能检查多个项目

javascript - 检查 js 文件中的角色以启用或禁用菜单项

javascript - 同步多个 jQuery 属性更新

javascript - 如何在 React 渲染函数中异步等待?

javascript - React - Apollo Client,如何将查询结果添加到状态

django - 在 Django restframework 中使用 python async/await

c++ - 在 C 和 C++ 中使用以前未知的参数回调函数

ruby-on-rails - 我应该从模型回调还是从 Controller 发送邮件?