2017-04-16 26 views
1

我遇到了一個問題,即無法異步執行SignalR集線器功能序列。使用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 

因此表示第二樞紐功能正想已經建立樞紐實例之前被執行,並且它有一個錯誤。

集線器函數返回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

它工作正常,謝謝。 我將進一步研究在promise處理中的反模式。 –

+0

隨時!這將是明智的':)'。 – Ricky