从客户端(角度)侧同步调用流星方法

时间:2017-01-09 23:00:30

标签: angularjs meteor

我完全停止尝试进行方法的同步调用。我试图从服务器端获取客户端列表(简化版本,最初是调用另一个API)并在网页上打印此列表。

客户端代码(Angular 1):

import template from './clientsList.html';
import {Meteor} from 'meteor/meteor';

class ClientsList {
    constructor() {
        console.log('First'); 
        Meteor.call('getClients', function (error, response) {
            if (error) {
                // If our API returned an error, we'd see it in the console.
                console.log(error);
            } else {
                console.log(response);
                this.clients = response;
            }
        });
        console.log('Second');
    }   
}

const name = 'clientsList';

export default angular.module(name, [
    angularMeteor
]).component(name, {
    template,
    controllerAs: name,
    controller: ClientsList
})
}

服务器端代码(Meteor):

    import {Meteor} from 'meteor/meteor';
    var Future = Npm.require( 'fibers/future' );

    Meteor.methods({
          // Synchronous method
        'getClients': function () {
            // Create our future instance.
            var future = new Future(); 
var clients = {[Name: 'Peter']};     
            future.return( clients ); 
            // preventinvg method from completing until the future receives a value
            return future.wait();
        }
    });

模板:

 <ul>
        <li ng-repeat="client in clientsList.clients">
                {{client.Name}}

        </li>
    </ul>

似乎我使用Future来使服务器端代码同步工作不起作用。这就是我在控制台中得到的结果:

First
Second
Array[1]

期待:

First 
Array[1]
Second

我非常感谢你的帮助。

3 个答案:

答案 0 :(得分:2)

您的服务器端代码(如果它可以正常工作)只是在将来结算时解析呼叫。

这使得当服务器有实际数据时会调用客户端回调,但仍然不会同步(没有办法让它在客户端上同步)。

您可以尝试使用promisesasync/await(ES7)或observables(RxJS)来简化您的代码,但它始终是异步的。

答案 1 :(得分:0)

从客户端到服务器的方法调用不能同步。你应该阅读这个Meteor.call

答案 2 :(得分:0)

你所看到的是正确的。从客户端到服务器的调用是异步的,你无能为力。

在您的模板中,您基本上做了3件事:记录&#39;首先&#39;,进行异步通话,以及记录&#39;秒&#39;

稍后,您的异步调用将返回并输入Meteor调用的回调。当你做第3次console.log()时的那个。

我意识到您正在同步处理服务器调用本身,但这与客户端和服务器之间的异步行为无关。