# 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);
});
~~~