У меня есть метод, который возвращает обещание:
joinGame = (playerToken) => {
let p = new Promise((resolve, reject) => {
return $.ajax(_path + '/api/Spel/JoinGame/'+playerToken,
{
method: 'GET',
success: (data) => {
resolve(data);
},
failed: () => {
reject('failed');
}
});
});
return p;
}
Я использую обещание здесь:
let tokenPromise = SPA.ResponseModule.getPlayerToken;
let gamePromise = SPA.ResponseModule.joinGame;
tokenPromise().then((tokenData) => {
gamePromise(tokenData['playerToken']).then((gameData) => {
...
});
});
Код работает нормально при игре в игру. Код тестирования выглядит следующим образом:
describe("init", () => {
beforeAll(() => {
spyOn(SPA.ResponseModule, "getPlayerToken").and.callFake(() => {
let d = $.Deferred();
let data = {
...
}
d.resolve(data)
return d.promise();
});
spyOn(SPA.ResponseModule, "joinGame").and.callFake((token) => {
let d = $.Deferred();
let data = {
...
};
d.resolve(data);
return d.promise
});
});
beforeEach(() => {
jasmine.Ajax.install();
SPA.init();
});
afterEach(() => {
jasmine.Ajax.uninstall();
});
it ("SPA.ResponseModule's getPlayerToken should be called", () => {
expect(SPA.ResponseModule.getPlayerToken).toHaveBeenCalled();
});
it ("SPA.ResponseModule's joinGame should be called", () => {
expect(SPA.ResponseModule.joinGame).toHaveBeenCalledWith(playerToken);
});
});
50% случаев, когда второе ожидание SPA.ResponseModule.joinGame не выполняется нормально, а 50% - работает. При каждом ожидании запуска SPA.init, в котором используется обещание, я получаю сообщение об ошибке gamePromise (...). Тогда это не функция . Предполагается, что проблема заключается в том, что gamePromise не возвращает обещание, но оно возвращает. Что здесь не так? Должен ли я издеваться над звонками?