像许多其他人一样,我想将第三方模块(Patio)的异步功能转换为同步功能。
function get_user_message_list(parameters, array, response)
{
var new_array = [];
for (var i in array) {
var json = array[i];
json['content']['users_seen'] = ["1757842565"];
json['content']['users_not_seen'] = [];
new_array.push(json);
}
console.log("NEW ARRAY :");
console.log(new_array);
response.writeHeader(200, {'Content-Type':'application/json'});
response.end(JSON.stringify(new_array));
}
function get_json_message(parameters, json)
{
console.log("JSON OBJECT :");
console.log(json);
var dataset = db.from(TABLES.USER).join(TABLES.MOVIE_LIST, {MLUserId: sql.URId}).join(TABLES.MOVIE, {MVId: sql.MLMovieId});
dataset.where('MLSeen={seen} AND MVSourceId={movie} AND MVSource={source} AND URId!={user}', {seen: 1, movie: json['content']['movie_id'], source: json['content']['movie_source'], user:parameters.FACEBOOK_ID}).all().then(function(users){
if (users) {
for (var j in users) {
json['content']['users_seen'].push(users[j].URId);
}
}
//console.log(json['content']['users_seen']);
dataset.where('MLSeen={seen} AND MVSourceId={movie} AND MVSource={source} AND URId!={user}', {seen: 0, movie: json['content']['movie_id'], source: json['content']['movie_source'], user:parameters.FACEBOOK_ID}).all().then(function(users){
if (users) {
for (var j in users) {
json['content']['users_not_seen'].push(users[j].URId);
}
}
console.log(json);
}, errorHandler);
}, errorHandler);
}
在get_user_message_list函数中,我迭代到一个数组,每次迭代我调用异步函数。在这个异步函数中,我使用Patio模块向MySQL数据库发出请求。但是你可以看到,我必须等待查询结果在将结果发送到上一个函数后得到。
如何将get_json_message转换为sync_get_json_message? 谢谢。
答案 0 :(得分:3)
当需要修复问题时,你可以和你应该将异步功能变成像同步功能一样的东西。你不可能永远不是正确的答案,不应该让程序员回答。
所以,我最近在nodeunit模块中找到了一些可以帮助你的代码。它会触发异步功能,跟踪哪些功能已准备就绪。在所有请求都进入后,触发回调。这可能是解决问题背后的想法(所以不,这不是最终的解决方案)。
async.forEachSeries = function (arr, iterator, callback) {
if (!arr.length) {
return callback();
}
var completed = 0;
var iterate = function () {
iterator(arr[completed], function (err) {
if (err) {
callback(err);
callback = function () {};
}
else {
completed += 1;
if (completed === arr.length) {
callback();
}
else {
iterate();
}
}
});
};
iterate();
};
这个测试让我看到它是如何完成的:
exports['series'] = function (test) {
var call_order = [];
async.series([
function (callback) {
setTimeout(function () {
call_order.push(1);
callback(null, 1);
}, 25);
},
function (callback) {
setTimeout(function () {
call_order.push(2);
callback(null, 2);
}, 50);
},
function (callback) {
setTimeout(function () {
call_order.push(3);
callback(null, 3, 3);
}, 15);
}
],
function (err, results) {
test.equals(err, null);
test.same(results, [1, 2, [3, 3]]);
test.same(call_order, [1, 2, 3]);
test.done();
});
};
快乐的节目!
答案 1 :(得分:0)
我一直在使用syncrhonize.js取得巨大成功。甚至有一个挂起的拉取请求(效果很好)来支持具有多个参数的异步函数。比node-sync imho更好更容易使用。添加了奖励,它具有易于理解和完整的文档,而节点同步则没有。
答案 2 :(得分:-1)
你不能也不应该。这将有效地阻止您的Node.JS服务器,您将失去Node.JS提供的所有优势。它也违背了Node.JS背后的整个异步理念。
只需将callback
参数传递给您的函数:
function get_json_message(parameters, json, callback){ // <---- note the callback
// some other stuff
dataset.where( ...
// some other stuff
dataset.where( ...
// some other stuff
// I've finished the job, call the callback
callback(); // <--- you can pass additional params here
});
});
}
并将其称为:
get_json_message( params, json, function() {
console.log('Hello world!');
// do whatever you like inside callback
});