Another very small promise!
能用简单优美的方式将任何同步或异步回调函数转换成then()链式调用!
then.js不同于其它promise,它没有resolve、也没有reject、更没有promise对象,所以你不再需要把异步任务封装成promise对象。
一个典型的promise都要封装:
function getFile() { var deferred = Q.defer(); FS.readFile("foo.txt", "utf-8", function (error, text) { if (error) { deferred.reject(new Error(error)); } else { deferred.resolve(text); } }); return deferred.promise; } getFile().then(successHandler[, errorHandler]);
若要进入下一个then链,上面then中的successHandler、errorHandler还得进行如上类似封装,搞得挺复杂!
then.js只有then对象,它包括then、all和fail三个方法和触发器defer,无需封装,直接将异步任务写入then()!因为then、all和fail都能自动生成下一个then对象,reject和resolve被合并为defer并注入任务函数,reject和resolve合并为defer的好处是,简化代码,还可以直接代替callback!
直链:
then(function (defer) { // .... defer(err, ...); }).then(function (defer, value) { // .... defer(err, ...); }, function (defer, err) { // .... defer(err, ...); }).then(function (defer) { // .... defer(err, ...); }).all(function (defer, err, value) { // .... defer(err, ...); }).then(function (defer) { // .... defer(err, ...); }).fail(function (defer, err) { // .... });
嵌套:
then(function (defer) { // .... defer(err, ...); }).then(function (defer, value) { //第二层 then(function (defer2) { // .... defer2(err, ...); }).then(function (defer2, value) { //第三层 then(function (defer3) { // .... }).all(defer2); // 返回二层 }).then(function (defer2) { // .... defer(err, ...); // 返回一层 }).fail(defer); // 返回一层 }).then(function (defer) { // .... defer(err, ...); }).fail(function (defer, err) { // .... });
async 嵌套:
then(function (defer) { // .... defer(err, array); }).then(function (defer, array) { then.each(array, function (next, value) { // ....逐步执行同步或异步任务 return next ? next() : defer(); }); }).then(function (defer) { // .... defer(err, ...); }).fail(function (defer, err) { // .... });
then对象取代callback:
function getFileAsync() { return then(function (defer) { readFile(failname, defer); }).then(function (defer, fileContent) { // 处理fileContent defer(null, result); }).fail(function (defer, err) { // 处理error defer(err); }); } getFileAsync().then(function (defer, file) { // .... }).fail(function(defer, err) { // .... });
更多用法请参考jsGen源代码,里面包含了一百多个then任务链,几百个then对象!
入口函数then():
var thenObj = then(function(defer) { // 执行同步或异步任务 defer(err, result1, ...); }) // 入口函数返回then对象
then对象的then方法:
thenObj.then(function(defer, successResult, ...) { // Success Handler // 执行同步或异步任务 defer(err, result1, ...); }, function(defer, successResult, ...) { // Error Handler,可选 // 执行同步或异步任务 defer(err, result1, ...); }) // then方法返回新的then对象(即下一个then链)
then对象的all方法:
thenObj.all(function(defer, err, successResult, ...) { // All Handler // 执行同步或异步任务 defer(err, result1, ...); }) // all方法返回新的then对象(即下一个then链)
then对象的fail方法:
thenObj.fail(function(defer, err) { // Error Handler // 执行同步或异步任务 defer(err, result1, ...); }) // fail方法返回新的then对象(即下一个then链)
关于Error收集器
then对象的then方法的errorHandler函数、all方法、fail方法均能收集error。其中then方法的errorHandler函数和all方法只能收集上一个then对象产生的error;fail方法则能收集再它之前所有then链产生的error。
关于触发器defer
then.js中最关键的就是defer,用于触发下一个then链。从上面可知,入口函数、then方法、all方法、fail方法中的任务函数的第一个参数都被注入了defer方法,如果任务函数本身是一个defer方法,则不会再被注入defer方法。
defer的第一个参数永远是error,如果error存在,则error下一个then对象的Error收集器,如果Error收集器不存在,则抛出error。
如果异步任务的callback的第一个参数为error,即callback(error, result1, ...)的形式,则可直接用defer代替异步任务的callback。Node.js中的异步函数基本都是这种形式,then.js用起来超方便。
关于fail方法
fail方法能捕捉在它之前的then链中的任何一个error。fail的优先级低于then方法的errorHandler和all方法,即then对象不存在then方法的errorHandler和all方法时error才会进入fail。当then链的某个then对象产生了error时,如果该then对象的下一个then对象存在Error收集器,则error进入该Error收集器,否则error会直接进入then链下游最近的fail方法,其间的then对象均会跳过。
then.each(array, function (next, value, index, array) { // 逐步执行同步或异步任务 asyncTask(value, function () { return next ? next() : callback(); }) });
Node.js:
npm install thenjs var then = require('thenjs');
Browser:
注意:then.js需要bind方法支持,IE8及以下请先加载es5-shim.js
then(function (defer) { // start asnys task // use defer as callback function asnycTask1(param, defer); }). then(function (defer, value1, ...) { // successHandler, value1, ... from asnycTask1 asnycTask2(value1, ..., defer); }, function (defer, err) { // errorHandler, err from asnycTask1 console.error(err); }). then(function (defer, value) { // successHandler, value from asnycTask2 asnycTask3(value, defer); }). then(function (defer, value) { // successHandler, value from asnycTask3 asnycTask4(value, defer); }). fail(function (defer, err) { // global errorHandler, err from asnycTask2 or asnycTask3 console.error(err); });
then()相关的东西包括但不限于:promise,thien.js 虽然还没彻底搞清楚这些个玩意儿,但是 现在知道了 then()是干嘛的了 最主要的,是解决了异步方法立刻返回的问题 这个特性带来的后遗症 , 假设 我要等异步处理完了,再去执行一段代码(后续代码) ,怎么做?定义一个全局flag, 异步处理完成更新flag, 然后把 后续代码放到setInter
Promise 是抽象的异步处理对象 构造方法: let promies = new Promise((resolve, reject) => { resolve(); //异步处理 }); Promise 有三个状态: Fulfilled: has-resolved, 表示成功解决,这时会调用 onFulfilled. Rejected: has-rejected, 表示解决失败,此时会调用
JS:promise.then的用法 基础:在这儿我们就可以了解一下promise–then的用法和promise–catch的用法了(js的异步) 1)promise–then的用法 首先先了解一下promise实例构建的语法具体见网址: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Object
2019.4.13 then()方法是异步执行。 意思是:就是当.then()前的方法执行完后再执行then()内部的程序,这样就避免了,数据没获取到等的问题。 语法:promise.then(onCompleted, onRejected); 参数 promise必需。Promise 对象。 onCompleted必需。承诺成功完成时要运行的履行处理程序函数。 onRejected可选。承诺被拒
IE浏览器以及edge浏览器的不支持es6里面promise的finally 报错 vue axios.get(…).then(…).catch(…).finally is not a function 解决方法: 借助promise.prototype.finally包 npm install promise.prototype.finally -S 最后记得在 main.js 里引入该依赖
vue中的.then()与.catch() 本文意在解读vue axios请求时常用的.then()与.catch() .then() 在axios请求完成后执行的下一步操作(异步执行),包括两个参数 axios.post(url, data) .then(res => { console.log(res);//第一个参数:成功后返回结果 }, error => {
问题内容: 如何快速进行异步回调?我正在为我的应用程序编写一个小框架,因为它应该同时在iOS和OS X上运行。因此,我将非特定于设备的主要代码放入该框架中,该框架还处理对我的在线api的请求。很显然,我也希望应用程序的GUI以及ViewController在api请求完成后立即做出反应。在Objective- C中,我通过将包含必须在id变量中调用的函数以及函数本身的视图保存在选择器变量中的视图来
几周前刚开始学Node.js....我不明白为什么“products”数组包含null而不是所需的对象.... 在第13行,当我对对象进行控制台日志记录时,我得到了所需的对象,但我不明白当我在map函数完成它的执行后在第40行对它们进行控制台日志记录时,它们为什么是空的.... 如果数组长度是2(这意味着推入成功),为什么里面存储的对象仍然是空的,而不是我想要存储的对象? 控制台输出 订单模式
稳定性: 1 - 试验的 async_hooks 模块提供了一个用于注册回调函数的 API,这些回调函数可追踪在 Node.js 应用中创建的异步资源的生命周期。可以通过以下方式使用: const async_hooks = require('async_hooks'); Terminology An asynchronous resource represents an object with
我正在尝试创建一个回调函数: 首先,我创建了一个函数接口,用于定义回调函数的约定 我创建了一个类,该类将定义一个方法来调用我的回调(我通过使用lambda表达式传递了接口的实现作为对此方法的引用) 下面是我的代码: 但当我运行这段代码时,我得到了这样的结果。 有人能告诉我为什么我会有这个例外吗?
回调 用户在支付完成后跳转回来的页面,一般只建议做显示用途。 // SDK实例化,传入公共配置 $pay = new \Yurun\PaySDK\AlipayApp\SDK($params); if($pay->verifyCallback($_GET)) { // 回调验证成功,可以通过GET参数来获取支付宝回传的参数 } else { // 回调验证失败 } 详见:test
问题内容: 我在互联网上读过有关回调的信息,但就我而言我还是听不懂。 我具有此功能,并且在运行时会记录到控制台。但是,现在我需要在另一个功能中使用此响应,而我正在努力做到这一点。 这是我应该得到的地方:(这显然不起作用,因为它不等待响应。) 我真的很难把头放在回调上,我在这里盯着自己瞎了。 问题答案: 回调无法返回值,因为它们将要返回的代码已经执行。 因此,您可以做几件事。一个传递回调函数,异步函
问题内容: 我如何才能使此代码返回值 而不冻结浏览器 。 您当然可以用新方法重写它。 编辑: 我需要至少在其他时间从php文件中获取20个变量。 问题答案: 这是不可能的。 Javascript在UI线程上运行;如果您的代码等待服务器回复,则浏览器必须保持冻结状态。 相反,您需要使用回调返回值: 请注意,这两个回调将以不可预测的顺序运行。 您应该修改设计,以便可以在单个AJAX请求中获得所有二十个