2016-08-11 121 views
0

我已經閱讀了Promise方法的一些在線教程,但我仍然有點困惑。 我有一個節點app.js執行幾個功能,包括連接到數據庫。使用承諾等待函數完成

db.connect(function(err) { 
    setupServer(); 
    if(err) { 
     logger.raiseAlarmFatal(logger.alarmId.INIT,null,'An error occurred while connecting to db.', err); 
     return; 
     } 

現在我已經寫了摩卡單元測試套件,它封裝了這個程序,並執行若干請求調用它。在某些情況下會發生的是,測試在未確認db已成功連接的情況下進行初始化,即:setupServer()已執行。

我該如何將promise方法實現爲這一點的異步代碼,如果不是承諾,我應該使用什麼?我已經嘗試了事件發射器,但這仍然不能滿足所有的要求,並在清理期間導致失敗。

+1

裏面是什麼setupServer?那裏有異步工作嗎? – Ozan

+0

它包括get/post/provisioning調用來在db – shanwar

+0

中設置密鑰空間,那麼您需要在setupServer函數內設置promise。 – Ozan

回答

0

如果您使用的摩卡咖啡,你應該使用asynchronous code approach。通過這種方式,您可以指示摩卡等待您在與其他人繼續前調用done函數。

這將讓你開始:

describe('my test', function() { 
    before(function(done) { 
    db.connect(function(err) { 
     setupServer(done); 
    }); 
    }) 

    it('should do some testing', function() { 
    // This test is run AFTER 'before' function has finished 
    // i.e. after setupServer has called done function 
    }); 
}); 

假設你setupServer調用done功能,當它這樣做:

function setupServer(done) { 
    // do what I need to do 
    done(); 
} 
0

您將需要使用Promise函數體內有async工作。對於你的情況,我認爲這是你所說的setupServer()包含Ajax請求。

conts setupServer =() => { 
    return new Promise((resolve, reject) => { 
    //async work 
    //get requests and post requests 
    if (true) 
     resolve(result); //call this when you are sure all work including async has been successfully completed. 
    else 
     reject(error); //call this when there has been an error 
    }); 
} 


setupServer().then(result => { 
    //... 
    //this will run when promise is resolved 
}, error => { 
    //... 
    //this will run when promise is rejected 
}); 

對於進一步閱讀: