下面讲一下,对于在写Node.js自动化测试脚本过程中,的编写回调问题, 大家可能会发现, Node.js对于高并发处理的性能非常不错, 即使是在使用单核的情况下, 那是因为它是基于事情,说白了就是callback, 回调。
这样的话,对于写代码的人来说, 回调的深度一深就会晕了。 为了解决这个问题, Q的出现解决了, 不知道怎么理解Q,说成反回调,可能会好一点。请参考 https://www.npmjs.org/package/q 文章写的非常详细。 在下说简的解释一下, 我们常用的方式 。
首先,需要安装Q, 在cmd下运行npm install q就行了。
例子:
对于一个模块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();
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()的值。