2017-04-16 25 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