响应回调时使用promises

时间:2017-12-30 22:13:43

标签: javascript asynchronous es6-promise

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

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

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

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

测试需要向服务器发送一系列命令,这些命令会根据服务器响应进行更改。我将命令发送到服务器,如此

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

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

互动应该是

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

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

之类的东西

我意识到承诺无法重复使用,因此我不能在每次响应回调发生时重置相同的承诺。

有没有办法通过承诺来做到这一点?我也开始读出发电机。那些人也会帮忙吗?

由于

2 个答案:

答案 0 :(得分:1)

你可以这样:

cur.execute("UPDATE online_booking SET st1 = (%s) HAVING max(ID) and phone = (%s)", (st1, phone))

并像这样使用它:

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

答案 1 :(得分:0)

您可以编写辅助函数来执行您所描述的操作。传入命令,它返回一个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!"));