我正在为服务器开发一个简单的TCP客户端,并且因为异步/等待功能而使用最新的节点7.6。我是新来的节点和异步编码,所以我很抱歉,如果这是非常容易的。节点7.6 async等待返回数据的问题
我想运行一个函数,该函数使用特定参数调用callServer()函数,等到它完成获取数据并将数据作为变量返回。
这里是我的代码:
'use strict'
const net = require('net')
var formattedJson = funcRequestToJson("Server.GetStatus", false)
doThings()
async function doThings() {
var info = await callServer()
}
async function callServer() {
var client = new net.Socket()
client.connect(1705, '192.168.28.16',() => {
console.log('connected to server')
client.write(formattedJson)
})
client.on('data', (data) => {
client.destroy()
//return await data
console.log(data.toString())
})
client.on('close',() => {
})
}
// method and paramBool are always required
// macAddress, paramKey, paramValue are required for if paramBool is true
function funcRequestToJson(method, paramBool, macAddress, paramKey, paramValue) {
var objectRequest = {}
objectRequest[ "jsonrpc" ] = "2.0"
objectRequest[ "method" ] = method
objectRequest[ "id" ] = 0
if (paramBool == true) {
objectRequest[ "params" ] = {
"client": macAddress,
[paramKey]: paramValue
}
}
var json = (JSON.stringify(objectRequest) + '\r\n')
return json
}
所以我没有申报objectRequest()的异步因为它没有等待服务器,但我认为callServer()应该是异步,对不对?我知道这可以通过承诺来完成,但我想使用异步/等待,这似乎是正确的。我想要返回来自callServer()和client.on('data',(data)内部的数据,但我似乎无法弄清楚如何异步执行它。我想在那里'd是一种创建异步函数的方法,并像我试着一样等待(等待返回数据),但它永远不能正常工作。
对不起,如果这是非常复杂的,但我一直在俯视在过去的一周异步节点教程和我仍然坚持。
谢谢!
异步/等待依赖于使用承诺进行异步操作的代码。因此,您需要从任何异步操作中返回一个承诺,以便与async/await一起使用它。因此,'callServer()'需要返回一个promise,在它内部的异步操作完成时解析。事实上,如果函数返回一个promise,你只能等待函数中的异步操作。 'await'使你不必在promises上编写'.then()'处理程序,但async/await不会奇迹般地知道异步操作何时完成。你仍然必须包装他们的承诺。 – jfriend00
啊,我不知道!正如我所说的,我是新来的异步编程方法。我不希望你必须写我的代码或任何东西,但是你能否指引我参考一些涉及承诺的参考资料/指南/教程?我找到了一些,但他们都很老。 –
您可以从MDN开始(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)。有很多很好的在线资源。 Javascript中的承诺自第一个标准以来一直保持一致,并且全部都编码在ES6中,因此您不应该在网上找到任何主要的不一致之处。只要避免与jQuery的Deferred或Promises有任何关系,因为它们已经相当不规范(他们试图在jQuery 3.x中修复它)。 – jfriend00