繁体   English   中英

响应回调时使用Promise

[英]Using promises when response callback

我试图弄清楚如何在我正在编写的测试中使用Promise。 我在浏览器中使用了普通的本地承诺。 还没有图书馆

该测试需要与服务器异步通信,在此我通过回调获得服务器响应

我有一个服务器对象,我在其中注册回调,如下所示:

server.onresponse = function(data){
  //do stuff with data
}

该测试需要向服务器发送一系列命令,这些命令根据服务器的响应而变化。 我像这样将命令发送到服务器

server.sendCommand({data:"do something"})

根据该命令,服务器将引发onresponse回调。 我需要读取服务器发送的数据,以确定下一个命令应该是什么。

互动应该像

  • 发送命令1并等待
  • 处理来自onresponse回调的数据
  • 发送命令2并等待
  • 处理来自onresponse回调的数据

我想使用Promise来使这种交互更加清晰。 就像一系列.then()

我意识到promise不能被重用,所以这不像每次onresponse回调发生时我都可以重置相同的promise。

有没有办法通过诺言做到这一点? 我也开始阅读发电机。 这些也有帮助吗?

谢谢

您可能会有这样的事情:

function sendCommand(data) {
    return new Promise(function(resolve,reject) {
         server.onresponse = resolve;
         server.sendCommand(data);
    });
}

并像这样使用它:

sendCommand({data:"do something"})
.then(function(data) {
    console.log(data);
    return sendCommand({data:"do something else "})
})
.then(function(data) {
    console.log(data);
})

您可以编写一个辅助函数来完成您所描述的操作。 传递命令,它将返回一个Promise ,该Promise将使用服务器的响应来解决。 如果存在一些错误处理回调,则也应使用它。 例如,我们称它为server.onerror 您应该用适当的处理程序替换它。

function sendCommand(cmd) {
  const promise = new Promise((resolve, reject) => {
    server.onresponse = resolve;
    server.onerror = reject;
  });
  server.sendCommand(cmd);
  return promise;
}

您将像描述的那样使用它,一个诺言链。 当然,您可能想对响应做一些事情,而不只是触发下一个命令。 并始终记得使用catch来处理任何错误!

sendCommand({data: "do thing 1"})
  .then((response) => sendCommand({data: "do thing 2"}))
  .then((response) => sendCommand({data: "do thing 3"}))
  .then((response) => console.log("All done!"))
  .catch((error) => console.log("Oops!"));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM