我完全停留在嘗試進行方法的同步調用。我試圖從服務器端獲取客戶端列表(簡化版本,原本是另一個API的調用),並在網頁上打印此列表。來自客戶端(角度)端的流星方法的同步呼叫
客戶端代碼(角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
})
}
服務器端代碼(流星):
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>
看來,我使用的未來,使服務器端代碼同步工作不起作用。這是我得到我的控制檯:
First
Second
Array[1]
期待:
First
Array[1]
Second
我會很感激的任何幫助。
您在代碼的同步部分(嚴格在方法內部)有未來。如果您的方法本身正在進行異步調用,但它不是,這會很有用。你需要客戶的承諾。此外,您的方法('getClients')的名稱意味着您可以使用pub-sub時使用方法來獲取數據。 –
@MichelFloyd,OP建議原始的服務器代碼調用一個API,因此它可能是異步的。 @OP,請注意,在進行API調用時,您可以在服務器上以同步方式使用[http包](https://docs.meteor.com/api/http.html)。即使您正在使用第三方API庫,也可以使用['wrapasync'](https://docs.meteor.com/api/core.html#Meteor-wrapAsync)對其進行封裝,但使用「Future」if這是你喜歡的。 – MasterAM
正確,但看看他在客戶端進行異步調用的代碼,但期望'First,Array [1],Second'不管他在服務器上做什麼都不會發生,因爲Meteor.call()是異步的。 –