1

他の多くの人々と同様に、サードパーティ モジュール (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 関数では、反復して配列を作成し、反復ごとに async 関数を呼び出します。この非同期関数では、Patio モジュールを使用して MySQL データベースにリクエストを送信しています。しかし、ご覧のとおり、前の関数に結果を送信した後、クエリ結果が取得されるまで待つ必要があります。

get_json_message を sync_get_json_message に変換するにはどうすればよいですか? ありがとうございました。

4

3 に答える 3

3

問題を修正する必要がある場合、非同期関数を同期関数のように動作するものに変えることができますし、すべきです。You can't は決して正しい答えではありません。プログラマーが答えるべきではありません。

だから、私は最近 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();
    });
};

ハッピープログラミング!

于 2012-08-02T18:04:55.643 に答える
0

私はsyncrhonize.jsを使用して大きな成功を収めています。複数のパラメーターを持つ非同期関数をサポートする保留中のプル リクエスト (これは非常にうまく機能します) もあります。node-sync imhoよりもはるかに使いやすく、使いやすいです。node-sync にはないのに対し、わかりやすくて完全なドキュメントがあるというボーナスが追加されました。

于 2014-01-19T19:19:02.873 に答える
-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
});
于 2012-07-26T13:44:26.003 に答える