下面講一下,對於在寫Node.js自動化測試腳本過程當中,的編寫回調問題, 你們可能會發現, Node.js對於高併發處理的性能很是不錯, 即便是在使用單核的狀況下, 那是由於它是基於事情,說白了就是callback, 回調。 數據庫
這樣的話,對於寫代碼的人來講, 回調的深度一深就會暈了。 爲了解決這個問題, Q的出現解決了, 不知道怎麼理解Q,說成反回調,可能會好一點。請參考 https://www.npmjs.org/package/q 文章寫的很是詳細。 在下說簡的解釋一下, 咱們經常使用的方式 。npm
首先,須要安裝Q, 在cmd下運行npm install q就好了。promise
例子:架構
對於一個模塊js文件,如「myModule.js」, 內容以下:併發
/**
* Created by Administrator on 10/22/2014.
*/
var Q = require('q');
var FS = require("fs");高併發
var waitMeFirst = function()
{
var deferrad = Q.defer();post
FS.readFile('D:\\test.txt', "utf-8", function (error, content) {性能
if (error) {
deferrad.reject(error);
}
if (content == undefined || content == null || content == '') {
deferrad.reject(new Error('文本內容爲空'));
}
else
{
deferrad.resolve(content)
}
});測試
return deferrad.promise;
};
exports.WaitMeFirst = waitMeFirst;
解釋
上面的例子是一個讀取文件文本內容的例子。
注意 waitMeFirst() 方法的返回是 「return deferrad.promise;」 promise 是什麼, 就是一種承諾, 告訴下面的步驟,「你要等我完成,無論我是成功仍是失敗都要等我」, 在正常的使用過程, 通常是當讀出文件的內容後, 會對內容進行處理,如顯示在頁面上,或是修改內容, 全部通常的作法會是,使用Callback,傳到FS.readFile中, 讓FS去回調你的處理。 這樣作,代碼可讀性不高, 但性能高。 對於Q來講, 如何 使用呢, 以下:
var myModule = require("./myModule");
myModule.WaitMeFirst()
.then(function(result){
console.log(result);
client.setValue('select一個控件', result);
}
, function(err){
console.log(err)
})
若是deferrad執行了reject 表示失敗,沒會進行then的function(err)方法中, 若是deferrad執行了resolve那麼then會進入function(result)中, 而且result將會是, resolver()的值。