ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 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); }); ~~~