关键词:
【中文标题】Coffeescript 等到从回调中设置标志,然后继续代码的下一部分【英文标题】:Coffeescript wait until flag is set from a callback and then move on to the next part of the code 【发布时间】:2021-11-12 19:05:05 【问题描述】:我这里有一个使用 coffeescript 的简单程序,它在 Raspberry pi 上创建一个服务器,它从在同一网络上的 Windows 机器上运行的 python 脚本接收数据,对这些数据进行一些计算并发回结果。
我想做的是让服务器保持打开、运行和接受数据,直到 python 脚本发送的参数要求它关闭。
为了尝试这个,我创建了一个循环来阻塞代码,直到这些标志被设置;但是,这会阻塞代码,因此没有设置标志(python 脚本甚至无法连接)。所以我想我需要在这里/promises 使用某种异步控制。
# Functions
process_data = (data) ->
double_value: data * 2
triple_value: data * 3
clean_up_actions = () ->
console.log "Cleaning up..."
# Create server
net = require('net')
domain = '10.1.1.28'
port = 9001
program_complete = false
clean = false
console.log("Creating server...")
server = net.createServer (socket) ->
console.log "#socket.remoteAddress has connected"
# When data is received, do something and send back a response
socket.on 'data', (data) ->
console.log("Data received...")
if not program_complete
incoming_data = JSON.parse(data)
some_useful_value = incoming_data["some_useful_value"]
result = process_data(some_useful_value)
socket.write JSON.stringify(result)
# Check if end of program
program_complete = incoming_data["end_program"]
if program_complete
clean_up_actions()
clean = true
console.log "Listening to #domain:#port"
server.listen port, domain
console.log("Waiting until complete...")
loop
break if program_complete and clean
console.log "--- PROGRAM FINISHED ---"
为了测试这一点,我使用了Q.delay(10000)
而不是循环,它按照我期望的方式工作(我得到了一个连接并且可以来回传递数据没有问题),除了当@ 987654323@设置为True,10秒后退出(如预期)。
...
# console.log("Waiting until complete...")
# loop
# break if program_complete and clean
# console.log "--- PROGRAM FINISHED ---"
Q = require('q')
Q.delay(10000).then ->
console.log "Done"
.finally ->
console.log('--- PROGRAM END ---')
process.exit(0)
我的问题是,我如何使用 Promise 或其他异步控件(如 Q.delay(n)
),而不是延迟一段时间,而是等到设置这些标志。
如果有兴趣,或者想测试一下,python代码如下
import socket
import json
import time
REMOTE_HOST = '10.1.1.28'
REMOTE_PORT = 9001
# Create a socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Connect to the remote host and port
sock.connect((REMOTE_HOST, REMOTE_PORT))
# Send some data
data_dictionary =
'some_useful_value' : 21,
'end_program' : False
data_to_send = json.dumps(data_dictionary).encode('utf-8')
sock.send(data_to_send)
print(sock.recv(1024))
time.sleep(0.5)
# Send some data, but this time, end
data_dictionary =
'some_useful_value' : 13,
'end_program' : True
data_to_send = json.dumps(data_dictionary).encode('utf-8')
sock.send(data_to_send)
print(sock.recv(1024))
time.sleep(0.5)
# Terminate
sock.close()
【问题讨论】:
【参考方案1】:您可能有几种方法可以实现这一点,我们等到您的代码中的标志 end_program
或 clean
被您的 socket.on 'data'
方法设置为 true。
在脚本结束时,您可以使用一个函数,该函数不断返回一个承诺,直到满足某个条件(在这种情况下,设置了标志 clean
)。
您使用的 Q 库应该足够了,因为我相信它的 .delay
函数是异步的。例如,在下面的代码中,该函数每秒检查一次标志,如果未设置标志,该函数将再次调用自身,并在另一秒钟后检查。如果设置了标志,我们就可以继续代码的下一部分。
这可能看起来像这样,使用变量 clean
作为您的标志:
waitForFlag = () ->
Q.delay(1000).then ->
if (clean)
console.log "Condition met! We can move on"
else
# if condition isn't met, check again in one second
waitForFlag()
# Call function
waitForFlag().then ->
process.exit(0)
【讨论】:
【参考方案2】:我的问题是,我如何使用 Promise 或其他异步控制(如 Q.delay(n))而不是延迟一段时间,而是等到这些标志被设置。
我认为简短的回答是否定的,或者至少在不深入研究一些更深奥的东西(如中断)的情况下不会。但是您可以通过设置短暂等待来近似“手动”,检查值是否已设置,然后再次等待或退出等待状态并根据检查结果继续执行其余逻辑。
我不熟悉您在此处导入的 Q 库(并使用 Q.delay
调用),但我认为您走在正确的道路上。在一般情况下,我认为您想要做的是使用setInterval
或setTimeout
基本上“让”执行一段相对较短的时间,然后检查该值是否已设置。我想Q.delay
在内部使用setTimeout
或类似的。
这是我的意思的粗略草图:
# here is the flag we'll wait to be set
the_flag = null
# here is an arbitrary callback method that represents
# the "action" to take once the flag is set
the_callback = (flag)->
console.log "#(new Date()).toISOString(): the_flag is now set to:", flag
# we'll keep a handle to the value returned by setInterval
# so we can cancel it later.
interval_id = null
# here's the method that checks if the flag has been set
# and responds accordingly
check_if_flag_is_set = ()->
if the_flag?
# it *is* set now, so clear the interval and callback
clearInterval(interval_id)
interval_id = null
the_callback(the_flag)
else
console.log "#(new Date()).toISOString(): the flag is not yet set, still waiting..."
# now just kick off the interval to invoke the "check"
# method every 3 seconds
interval_id = setInterval( check_if_flag_is_set, 3000 )
现在,如果/当 the_flag
的值在某些异步代码中设置时,check_if_flag_is_set
方法将检测到它并将结果报告给 the_callback
。请注意,setInterval
等待期是非阻塞的 - 在我们等待下一次调用 check_if_flag_is_set
时,其他代码可以并且将会执行。
也就是说,网络 i/o 交互也是非阻塞的,所以如果标志是由正在写入套接字的一些数据设置的,那么您实际上不需要额外的一层异步、非阻塞等待 via setInterval
。您可以等待网络侦听器发出 on('data',handler)
或类似事件。
【讨论】:
如何在 ngCookies 中设置 httpOnly 标志?
】如何在ngCookies中设置httpOnly标志?【英文标题】:HowtosethttpOnlyflaginngCookies?【发布时间】:2015-07-2106:05:38【问题描述】:我有一个想要存储在cookie中的JWT令牌。cookie至少需要设置HttpOnly标志,但我还想将Secure标志设置为true。从an... 查看详情
在 AngularJS 中设置 JSONP 回调函数
】在AngularJS中设置JSONP回调函数【英文标题】:SettingtheJSONPcallbackfunctioninAngularJS【发布时间】:2013-01-0910:45:21【问题描述】:我正在尝试通过Angular$resource服务从WebAPI获取数据。该服务公开JSONP接口,但不允许设置回调名称。一切... 查看详情
在android的sqlite数据库中设置标志
】在android的sqlite数据库中设置标志【英文标题】:setflaginsqlitedatabaseinandroid【发布时间】:2012-01-3105:28:54【问题描述】:在我的应用程序中,我想为收藏引用设置标志。单击按钮时,我想为该特定行设置该标志。在我的数据库中... 查看详情
等到当前位置在 didFinishLaunchingWithOptions 中设置
】等到当前位置在didFinishLaunchingWithOptions中设置【英文标题】:WaitUntilCurrentLocationissetindidFinishLaunchingWithOptions【发布时间】:2011-01-2116:21:07【问题描述】:我的主页UIView需要当前位置坐标,我不希望在获得这些坐标之前调用它。... 查看详情
如何在 Emscripten 中设置 gcc 标志
】如何在Emscripten中设置gcc标志【英文标题】:HowtosetgccflagsinEmscripten【发布时间】:2016-05-2419:28:48【问题描述】:我使用以下命令编译:gcc-Wall-march=native-O3-ffast-math-I/usr/local/include-I/usr/local/include-owaonmain.onotes.omidi.oanalyse.offt.ohc.osnd 查看详情
如何在 Spring Boot 中设置同站点 cookie 标志?
】如何在SpringBoot中设置同站点cookie标志?【英文标题】:Howtosetsame-sitecookieflaginSpringBoot?【发布时间】:2020-02-1115:02:40【问题描述】:是否可以在SpringBoot中设置Same-SiteCookie标志?我在Chrome中的问题:与http://google.com/的跨站点资源... 查看详情
如何使用 jQuery 在 css 中设置重要标志? [复制]
】如何使用jQuery在css中设置重要标志?[复制]【英文标题】:HowcanIsettheimportantflaginacsswithjQuery?[duplicate]【发布时间】:2012-09-0302:26:17【问题描述】:可能重复:Jquerycss:applying!importantstyles我有以下代码:$("body").ajaxStart(function()$(this... 查看详情
在 Java regex.Pattern 中设置两个标志
】在Javaregex.Pattern中设置两个标志【英文标题】:SettwoflagsinJavaregex.Pattern【发布时间】:2013-08-2207:56:45【问题描述】:我需要这样的匹配器:Matcherkuchen=Pattern.compile("gibtesKucheninderK\\u00FCche",Pattern.CASE_INSENSITIVE).matcher("");问题是它不... 查看详情
如何在 libwebsockets 回调中设置用户自定义指针?
】如何在libwebsockets回调中设置用户自定义指针?【英文标题】:HowcanIsetausercustompointerinlibwebsocketscallback?【发布时间】:2018-07-1601:17:53【问题描述】:我在lws_protocol中添加了一个指针变量。调用回调函数时,用户指针始终为NULL。... 查看详情
在 GCC 中设置 std=c99 标志
】在GCC中设置std=c99标志【英文标题】:Settingstd=c99flaginGCC【发布时间】:2011-01-1217:05:41【问题描述】:我想知道是否有任何文件可以设置-std=c99标志,这样我就不必为每次编译都设置它。我在Ubuntu上使用GCC4.4。【问题讨论】:【... 查看详情
如何在 ember-cli 中设置标志,而不是环境?
】如何在ember-cli中设置标志,而不是环境?【英文标题】:Howtosetflagsinember-cli,otherthanenvironment?【发布时间】:2014-08-2712:24:54【问题描述】:这是目前可能的:emberbuild--environment=production...而我想做这样的事情:emberbuild--environment=p... 查看详情
android在回调中设置view的setvisibility为visible时,不起作用
参考技术AAndroid在回调中设置View的setVisibility为VISIBLE时,不起作用。解决方式:在回调中用handler.post()。必须post中设置。具体原因暂未可知。 查看详情
Javascript:如何在回调中设置父对象变量
】Javascript:如何在回调中设置父对象变量【英文标题】:Javascript:Howcansetparentobjectvariableincallback【发布时间】:2012-07-1807:12:25【问题描述】:我在我的mongoosejsODM架构中定义了一个自定义方法,它允许我生成盐并对给定的密码进... 查看详情
创建 React 应用程序:根据 .env 变量在 package.json 中设置 HTTPS 标志
】创建React应用程序:根据.env变量在package.json中设置HTTPS标志【英文标题】:CreateReactApp:SetHTTPSflaginpackage.jsonbasedon.envvariable【发布时间】:2020-11-2521:45:45【问题描述】:要让createreactapp在SSL模式下运行,我们需要像这样在package.jso... 查看详情
为啥 Chrome 和 Firefox 以不同方式处理 jQuery ajax() 回调中设置的 javascript 变量?
】为啥Chrome和Firefox以不同方式处理jQueryajax()回调中设置的javascript变量?【英文标题】:WhydoChromeandFirefoxhandlejavascriptvariablesetinsidejQueryajax()callbackdifferently?为什么Chrome和Firefox以不同方式处理jQueryajax()回调中设置的javascript变量?【... 查看详情
为啥 Chrome 和 Firefox 以不同方式处理 jQuery ajax() 回调中设置的 javascript 变量?
】为啥Chrome和Firefox以不同方式处理jQueryajax()回调中设置的javascript变量?【英文标题】:WhydoChromeandFirefoxhandlejavascriptvariablesetinsidejQueryajax()callbackdifferently?为什么Chrome和Firefox以不同方式处理jQueryajax()回调中设置的javascript变量?【... 查看详情
在 double 中设置位并使用 g++ 的优化标志进行编译
】在double中设置位并使用g++的优化标志进行编译【英文标题】:Settingbitsinadoubleandcompilingwithoptimizationflagsofg++【发布时间】:2011-06-2212:38:03【问题描述】:我正在尝试将位设置为双精度位(IEEE标准754)。说我想“构建”一个3,我... 查看详情
在通知回调中设置时,标签不会出现在标签栏项目上
】在通知回调中设置时,标签不会出现在标签栏项目上【英文标题】:Badgenotappearingontabbaritemwhensetinnotificationcallback【发布时间】:2017-07-2817:49:24【问题描述】:当我的应用收到通知时,我正在尝试将标签栏中的徽章设置为第四... 查看详情