![](/img/trans.png)
[英]Elegant callback binding when using promises and prototypes in javascript
[英]Using promises when response callback
我试图弄清楚如何在我正在编写的测试中使用Promise。 我在浏览器中使用了普通的本地承诺。 还没有图书馆
该测试需要与服务器异步通信,在此我通过回调获得服务器响应
我有一个服务器对象,我在其中注册回调,如下所示:
server.onresponse = function(data){
//do stuff with data
}
该测试需要向服务器发送一系列命令,这些命令根据服务器的响应而变化。 我像这样将命令发送到服务器
server.sendCommand({data:"do something"})
根据该命令,服务器将引发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.