node.js – 将asynchronous函数变成同步函数

像许多其他人一样,我想把第三方模块(Patio)的asynchronousfunction变成同步function。

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函数中,我迭代到一个数组中,并为每次迭代调用asynchronous函数。 在这个asynchronous函数中,我使用Patio模块向MySQL数据库发出请求。 但是正如你所看到的,我必须等待查询结果被发送到前一个函数后得到。

我怎样才能把get_json_message变成sync_get_json_message? 谢谢。

你可以和你应该把asynchronous函数转换成类似同步函数的东西,当一个问题需要修复的时候。 你不可能永远不是正确的答案,不应该是程序员回答。

所以,我最近在nodeunit模块中find了一些可以帮助你的代码。 它触发asynchronousfunction,跟踪哪些是准备好的。 在所有请求进入后,触发callback。 这可能是解决你的问题背后的想法(所以不,这不是最终的解决scheme)。

 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(); }; 

这个testing触发了我看它是如何完成的:

 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(); }); }; 

快乐编程!

你不能,你不应该。 这将有效地阻止你的Node.JS服务器,并且你将失去Node.JS提供的每一个优点。 另外它违背了Node.JS的整个asynchronous思想。

只需将callbackparameter passing给您的函数:

 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 }); 

我一直在使用syncrhonize.js ,取得了巨大的成功。 甚至还有一个挂起的请求(工作得很好)来支持具有多个参数的asynchronous函数。 比节点同步imho更好,更容易使用。 增加了奖励,它有易于理解和详尽的文档,而节点同步不。