# Q框架的Q.deferd使用方案
* 写一个函数带一个参数,返回函数结果为该参数累加1000,如果结果大于5000则返回错误,如果小于5000则返回累加结果。
~~~
//引用q框架
var Q = require('q');
//全局数据
//函数首选promise化
function f1(args) {
var defered = Q.defer();
setTimeout(function () {
//计算
args += 1000;
//如果结果大于5000那么给出错误的结果
if (args > 5000) {
//错误的结果
defered.reject('错误');
}
else {
//正确的结果
defered.resolve(args);
}
}, 1000);
return defered.promise;
};
//执行f1,并且执行then方法,等待异步结果
f1(100).then(function (data) {
console.log(data);
},function (err) {
console.log(err);
});
~~~
* 【使用q框架处理有一连串的异步方法,需要按顺序执行】一个变量经历4个工序,分别每个工序需要若干时间,假设第一个工序需要1秒,第二个工序需要2秒,第三个工序需要4秒,第四个工序需要1秒
~~~
var Q = require('q');
//f1(data)的参数data为初始值
function f1(data) {
var defered = Q.defer();
setTimeout(function () {
data += 'f1';
console.log('f1结束');
defered.resolve(data);
}, 1000);
return defered.promise;
};
//f2(data)的参数data会衔接上f1的data的结果
function f2(data) {
var defered = Q.defer();
setTimeout(function () {
data += 'f2';
console.log('f2结束');
defered.resolve(data);
}, 2000);
return defered.promise;
};
function f3(data) {
var defered = Q.defer();
setTimeout(function () {
data += 'f3';
console.log('f3结束');
defered.resolve(data);
}, 4000);
return defered.promise;
};
function f4(data) {
var defered = Q.defer();
setTimeout(function () {
data += 'f4';
console.log('f4结束');
defered.resolve(data);
}, 1000);
return defered.promise;
};
f1('hzj').then(f2).then(f3).then(f4).done(function (data) {
console.log(data);
});
~~~
* 动态多异步任务顺序执行
~~~
var Q = require('q');
function f2(temp) {
var defered = Q.defer();
setTimeout(function () {
temp.data += 'f2';
console.log(temp.js + ':f2结束');
temp.js += 1;
defered.resolve(temp);
}, 2000);
return defered.promise;
};
//动态自定义函数异步队列
function task() {
//需要执行的函数数组,需要注意的是这里是函数对象,并不是执行函数,且函数对象需要返回的是promise
var funcs = [f2, f2, f2, f2];
//设置初始值
var temp = {
//计数器
js: 0,
//真正的数据
data: 'hzj'
};
//实例化Q,并且给出初始值
var result = Q(temp);
//开始异步顺序执行函数数组里面的函数
//形成xx.then().then().then()形式
funcs.forEach(function (f) {
result = result.then(f);
});
//返回最后一个异步任务
return result;
}
//开始执行
//done方法为全部结束后,执行结果
task().done(function (data) {
console.log(data.data);
});
~~~