2017-04-16 22 views
1

SignalRハブ関数のシーケンスが非同期に実行されないという問題が発生しました。Typescript Async/SignalR関数で待機する

私が持っている:

//Hub functions 
//Initializing hub server and clients. 
function HubStart() { 
    $.connection.hub.start().then(function() { 
     console.log(1); 
     return new Promise(resolve => resolve); 
    }); 
} 
//Hub server-side function that add user's name to chat board. 
function HubUserOnline(user: any) { 
    $.connection.boardHub.server.userOnline(user).then(resolve => { return new Promise(resolve => resolve); }); 
} 

//Main 
var viewModel = ko.mapping.fromJS(model, mappingOption); 
main(); 

//Definition of the main function 
async function main() { 
    console.log(0); 
    await HubStart(); 
    console.log(2); 
    await HubUserOnline(ko.mapping.toJS(viewModel.CurrentUser)) 
    console.log(3); 
    } 
}); 

しかし、コンソールは言う:

> 0 
> 2 
> Uncaught (in promise) Error: SignalR: Connection must be started before data can be sent. Call .start() before .send() 
> at hubConnection.fn.init.send (jquery.signalR-2.2.1.js:780) 
> at init.invoke (jquery.signalR-2.2.1.js:2734) 
> at Object.userOnline (hubs:120) 
> at HubUserOnline (WaitingRoom.ts:190) 
> at WaitingRoom.ts:203 
> at Generator.next (<anonymous>) 
> at fulfilled (WaitingRoom.ts:1) 
> 1 

したがって、それはハブインスタンスが作成されていたし、それが持って前に、第2のハブ機能を実行するつもりだった示しエラー。

ハブ関数はJQueryPromiseを返します。したがって、ハブ関数が完了したときに関数が約束を返すようにしました。誰も私のコードと試行で不具合を示すことができますか?

+0

約束は、通常のオブジェクトです。関数を使用したい場合は、それらを関数から戻す必要があります。そうでなければ、関数は 'undefined'を返します。 –

答えて

1

HubStartHubUserOnlineは約束を返しておらず、代わりに約束通りの反パターンになっています。

次のことを試してみてください。

//Hub functions 
//Initializing hub server and clients. 
function HubStart() { 
    return new Promise((resolve, reject) => { 
    $.connection.hub.start().then(() => { 
     console.log(1); 
     resolve(); 
    }); 
    }); 
} 
//Hub server-side function that add user's name to chat board. 
function HubUserOnline(user: any) { 
    return new Promise((resolve, reject) => { 
    $.connection.boardHub.server.userOnline(user).then(() => { 
     resolve(); 
    }); 
    }); 
} 

//Main 
var viewModel = ko.mapping.fromJS(model, mappingOption); 
main(); 

//Definition of the main function 
async function main() { 
    console.log(0); 
    await HubStart(); 
    console.log(2); 
    await HubUserOnline(ko.mapping.toJS(viewModel.CurrentUser)) 
    console.log(3); 
} 
}); 
+0

正常に動作しました。ありがとうございます。 私は、プロミスハンドリングの反パターンについてさらに検討します。 –

+0

いつでも!それは賢明だろう: ')。 – Ricky

関連する問題