【问题标题】:Typescript Async/Await with SignalR Function带有 SignalR 功能的 Typescript Async/Await
【发布时间】:2017-09-12 12:31:05
【问题描述】:

我遇到了一个 SignalR hub 函数序列无法异步执行的问题。

我有:

//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,所以我尝试让一个函数在集线器函数完成后返回一个承诺。任何人都可以指出我的代码和试验中的错误吗?

【问题讨论】:

  • Promise 是常规对象。如果你想使用它们,你需要从函数中返回它们,否则,你的函数只返回undefined

标签: javascript typescript asynchronous knockout.js signalr


【解决方案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);
}
});

【讨论】:

  • 它工作正常,谢谢。我将进一步研究 Promise 处理中的反模式。
  • 随时!那是明智的:)
猜你喜欢
  • 2023-03-10
  • 2016-08-22
  • 2017-11-07
  • 1970-01-01
  • 2017-10-10
  • 2017-08-31
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多