簡體   English   中英

異步javascript最佳做法

[英]asynchronous javascript best practices

這是使用node.js / express.js的示例,該示例是我用異步代碼(函數通過2 db調用在請求上呈現頁面)遇到的一個典型問題:

exports.index = function(req, res){
    res.render('index', {
        data1: getData1(),
        data2: getData2()
    });
};

這是一個函數的外觀:

function getData1() {
    var assets = db.get("assets");
    assets.find().on('success', function (docs) {
        // What to do ?
    });
}

我嘗試使用async.js這是一個非常有用的模塊,但是我仍然缺少有關如何處理這種情況的知識。

有人可以建議有關異步javascript編碼的最佳實踐的良好資源嗎?

使用異步工作流庫,例如async

function getData1(done) {
    var assets = db.get('assets');
    assets.find().on('success', done);
}

function getData2(done) {
    var assets2 = db.get('assets2');
    assets2.find().on('success', done);
}

exports.index = function(req, res, next){
    async.parallel({
        d1: getData1,
        d2: getData2
    }, render);

    function render (err, data) {
        if (err) {
            return next(err);
        }

        res.render('index', {
            data1: data.d1,
            data2: data.d2
        });
    });
};

這樣,您可以堅持在整個Node包中執行的callback(err, result)樣式,同時保持代碼的健全和美觀。 異步提供了簡化工作流程的方法。 在這種情況下,我使用了async.parallel方法,該方法允許您同時運行任意數量的回調,然后在其他回調完成后運行作為第二個參數提供的函數。

解決您的問題的一種方法是通過將回調函數傳遞給執行異步操作的函數來鏈接異步命令:

exports.index = function(req, res){
    getData1(function (data1) {
        getData2(function (data2) {
            res.render('index', {
                data1: data1,
                data2: data2
            });
        });
    });
};

function getData1(callback) {
    var assets = db.get("assets");
    assets.find().on('success', callback);
}
// Similarly for getData2

但是,嵌套的回調可能很快變得難以管理。 您可以命名函數以幫助解決此問題:

exports.index = function(req, res){
    var data2Success = function (data1, data2) {
        res.render('index', {
            data1: data1,
            data2: data2
        });
    },
    data1Success = function (data1) {
        getData2(data2Success.bind(this, data1));
    };

    getData1(data1Success);
};

我通常執行以下操作之一:

1)嵌套通話:

exports.index = function(req, res){
  //first call
  assets.getRecord(function (err, docs) {

    // 2nd call
    assets.getSomeOtherRecord(function (err, otherDocs) {
        res.render('index', {
          data1:docs,
          data2: otherDocs
        });
    );

  });

};

如果您的代碼很簡單,並且您不介意一個接一個地運行它們,那么就足夠了。 如果這些都不適用,我將使用方法2:

2)使用async.js或Q作為此處顯示的其他答案。

學習異步的資源:
-http://net.tutsplus.com/tutorials/javascript-ajax/managing-the-asynchronous-nature-of-node-js/
-http://www.sebastianseilund.com/nodejs-async-in-practice

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM