我今天刚刚开始使用 node.js 和 Zeromq 绑定,并看到一些我不太理解的行为。
这是我的示例代码,它调用同一台计算机上端口 9000 上的另一个基于 ruby 的 Zeromq REP 进程:
var zeromq = require("zmq");
var http = require('http');
var counter = 0;
var availabilityResponse = function(counter, data, request, response) {
var str = data.toString('utf-8');
console.log(str);
response.writeHead(200, {'Content-Type': 'text/plain'});
response.write(str);
response.end();
}
var zmqSocket = zeromq.createSocket('request');
zmqSocket.connect("tcp://127.0.0.1:9000");
var server = http.createServer()
server.on('request', function(request, response) {
counter += 1;
zmqSocket.send("Hola! - This is call # " + counter);
zmqSocket.on('message', function(data) {
availabilityResponse(counter, data, request, response);
});
});
server.listen(8888);
console.log("Starting …Run Code Online (Sandbox Code Playgroud) 我已经到处寻找解决方案,但到目前为止还没有找到任何东西(我可能使用了错误的关键字!如果这是重复的,请指出,我将删除)。
你们中的一位杰出的天才能否向我解释一下为什么以下内容不能像人们希望的那样工作?我的意思是回调在回调内完成complete之前被调用,我不太明白为什么。setTimeoutsuccess
$.ajax({
url: options.url,
data: options.data,
success: function(){
setTimeout(function(){
console.log('firing');
},2000);
},
dataType: options.dataType,
complete: function(){
console.log('ended');
}
});
Run Code Online (Sandbox Code Playgroud)
setTimeout是因为回调中已经启动了一个新线程吗success?
是否可以在不将回调函数传递到回调中的情况下实现此目的success?
我正在尝试使用nodejs从mysql表中获取数据。我调用另一个节点 js 文件中的 sql 例程。但是,我无法让回调返回数据。我认为问题可能是我从节点 js 文件调用异步例程,而不是从角度或常规 javascript 程序调用异步例程。下面是我正在调用的导出脚本。
exports.getVenueById = function(db, id) {
var http = require('http');
var mysql = require('mysql');
var query = "SELECT * FROM venues WHERE auto_increment = ? "
query = mysql.format(query, id);
console.log("query=" + query);
db.query(
query,
function(err, rows) {
if(err) console.log("error=" + err);
console.log("rows=" + rows[0]['auto_increment']);
res.json({success: true, response: rows});
//return rows[0];
});
}
Run Code Online (Sandbox Code Playgroud)
我知道这是有效的,因为我正在将结果写入控制台。问题是数据永远不会返回到下面的调用节点 js 例程。
function getVenueData (id , callback) {
(function () {
venueData = venueTable.getVenueById(db, id);
if(venueData) {
callback(); …Run Code Online (Sandbox Code Playgroud) 当我检测到已更改且即将更新时,我尝试更改attribute_1值。attribute_2
对象已更新,但设置的attribute_1值并未持续存在,为什么?
before_update :check_attribute2_change
def check_attribute_2_change
if attribute_2_changed?
attribute_1 = nil
end
end
Run Code Online (Sandbox Code Playgroud) 我拥有的:
所以我有一个带有私有成员的类和一个静态函数。该函数必须真的是静态的,我无法改变它。
我想要的是:
我需要从静态函数访问私有成员。有任何想法吗?:)
请检查以下代码:
class Base
{
private:
int m_member;
public:
Base() : m_member(0) {};
~Base() {};
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode); /* This must really be static because it is coming from C */
};
void Base::key_callback(GLFWwindow* window, int key, int scancode, int action, int mode)
{
m_member = 1; // <---- illegal reference to non-static member 'Base::m_member'
}
Run Code Online (Sandbox Code Playgroud) 我看过很多关于它的帖子,但我仍然不明白回调。我得到了这样的函数:
function getData (url) {
request(url, function (error, response, data) {
//...
return data;
}
});
}
var data = getData(url);
// I got undefined because it's not finished
if (data)
...
Run Code Online (Sandbox Code Playgroud)
我如何等待我的函数返回继续。我已经看到很多关于回调和承诺的事情,但在这种情况下如何使用它?例如我看过这篇文章,但我不明白答案。
我正在使用节点js
以下面的 flatten 函数为例,为什么我不能return直接在累加器上使用。推()
function flatten(array){
return reduce(array,function(accumulator, value){
if(Array.isArray(value)){
each(value,function(value1){
return accumulator.push(value1); //as shown
})
}else{
return accumulator.push(value); //as shown
}
},[]);
};
Run Code Online (Sandbox Code Playgroud)
相反,我需要在单独的行上返回累加器?
function flatten(array){
return reduce(array,function(accumulator, value){
if(Array.isArray(value)){
each(value,function(value1){
accumulator.push(value1);
})
}else{
accumulator.push(value);
}
return accumulator //as shown
},[]);
};
Run Code Online (Sandbox Code Playgroud)
但是如果使用诸如 .concat() 之类的方法,我将能够使用return它......
我在理解回调方面有一点问题。我在过去 2 天内阅读了很多内容,我所了解的内容如下(如果我错了,请纠正我):
JavaScript 是一种单线程语言,您可以进行同步和异步编程。同步意味着,每条语句在执行之前等待前一条语句完成。这可能会导致麻烦,因为例如,如果与数据库的连接需要很多时间,则前一个之后的语句必须等待。最后,这是非常糟糕的,这就是为什么最好在 Javascript 中进行异步编程,因为异步代码不必等待,代码可以继续运行,用户不必等待。
异步编程需要回调(高阶函数)。
现在我尝试通过很多教程等编写一个小例子。
function testCallback(a,callback){
console.log('1.function and given parameter: '+a);
callback(10);
}
testCallback(5 , function(x){
console.log("2.function and given parameter of 1. function: "+x);
});
Run Code Online (Sandbox Code Playgroud)
那正确吗?输出是:
1.function and given parameter: 5
2.function and given parameter of 1. function: 10
Run Code Online (Sandbox Code Playgroud)
我不明白,这段代码有什么好处,因为我认为这仍然会导致麻烦?如果“console.log('1.function and....') 有问题,callback(10) 函数会不会停止?
谢谢你的帮助!
我无法理解 JavaScript 中的回调如何获取它们的参数。或者换句话说:如何实现一个高阶函数,使其回调接受例如标准err和data参数。
就像在这篇关于异步 JavaScript 的文章中以通常方式使用的回调示例中一样(我知道这是通常的,因为我在 Node.js 中看到的正是这种模式moongose(即用于在 db 中创建数据):
function getData(options, callback) {
$.get("example.php", options, function(response) {
callback(null, JSON.parse(response));
}, function() {
callback(new Error("AJAX request failed!"));
});
}
// usage
getData({name: "John"}, function(err, data) {
if(err) {
console.log("Error! " + err.toString())
} else {
console.log(data);
}
});
Run Code Online (Sandbox Code Playgroud)
回调究竟是如何得到的参数err和data基于怎样getData()的功能上面声明?
我正在尝试制作一个程序,通过给定的进程 ID 检测进程终止。但是我不能给回调函数提供任何参数。我怎样才能做到这一点?谢谢。
void CALLBACK WaitOrTimerCallback(
_In_ PVOID lpParameter,
_In_ BOOLEAN TimerOrWaitFired,
DWORD processID)
{
MessageBox(0, L"The process has exited.", L"INFO", MB_OK);
std::cout << processID << std::endl;
return;
}
int main()
{
DWORD dwProcessID = 1234;
HANDLE hProcHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID);
HANDLE hNewHandle;
RegisterWaitForSingleObject(&hNewHandle, hProcHandle, WaitOrTimerCallback(?, ?, dwProcessID), NULL, INFINITE, WT_EXECUTEONLYONCE);
}
Run Code Online (Sandbox Code Playgroud)