我完全停止尝试进行方法的同步调用。我试图从服务器端获取客户端列表(简化版本,最初是调用另一个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
我非常感谢你的帮助。
答案 0 :(得分:2)
您的服务器端代码(如果它可以正常工作)只是在将来结算时解析呼叫。
这使得当服务器有实际数据时会调用客户端回调,但仍然不会同步(没有办法让它在客户端上同步)。
您可以尝试使用promises,async/await(ES7)或observables(RxJS)来简化您的代码,但它始终是异步的。
答案 1 :(得分:0)
从客户端到服务器的方法调用不能同步。你应该阅读这个Meteor.call
答案 2 :(得分:0)
你所看到的是正确的。从客户端到服务器的调用是异步的,你无能为力。
在您的模板中,您基本上做了3件事:记录&#39;首先&#39;,进行异步通话,以及记录&#39;秒&#39;
稍后,您的异步调用将返回并输入Meteor调用的回调。当你做第3次console.log()时的那个。
我意识到您正在同步处理服务器调用本身,但这与客户端和服务器之间的异步行为无关。