在写作过程中不断Node.js,IO
操作可能导致皮拉米德的噩梦。回调
函数的多重嵌套使代码难以
维护。它使用CommonJS承诺封装异步函数,并使用统一的链的API来摆脱多回调的噩梦。
非阻塞IO模型允许我们使用一个回调函数
方法的IO操作的Node.js提供,但当需要
连续的IO操作,回调函数会有多个嵌套的代码,非常漂亮,而且很难维持,可能有很多
错误处理代码重复,也被称为金字塔的厄运。
复制代码代码如下所示:
第一步(
功能(中){)
STEP2(value1,功能(2){
STEP3(value2,功能(3){
第四(3,功能(珍惜){
一些珍惜 / /做
});
});
});
});
这实际上是js
控制流的问题。对于这个问题,有很多
解决方案,如异步或eventproxy,但本文的主题是在CommonJS规范承诺解决这个问题。
什么是承诺
有许多种CommonJS承诺规格,我们一般讨论的承诺/ +规范,定义了承诺的基本行为。
承诺是一个对象,这通常是一个异步操作,可能会在未来完成。此操作可能会成功,可能会失败,所以一个承诺的对象一般有3种状态:
等待,满足,和拒绝。他们代表未完成,顺利完成,手术失败分别。曾经的承诺对象的状态变化从待履行或拒绝,没有办法改变它的状态。
允诺对象通常有一个方法,它允许我们操作可能成功或失败后返回的值:
promise.then(onfulfilled,onrejected)
显然,当时的方法需要两个
参数,他们通常有两个功能,一是结果成功后处理操作,另一个是用于结果与
原因的失败后成功的两个函数的第一个参数失败后处理操作。如果它不是一个功能,是通过的方法,将这个参数将被忽略。
该方法的返回值是一个允诺对象,它允许我们调用它来控制过程的
影响:
如果返回值onfulfilled或onrejected功能没有承诺的对象,这将是第一个参数onfulfilled在接下来的方法。如果返回值是一个允诺对象,那么方法的返回值是允诺对象。
如果抛出一个异常onfulfilled或onrejected功能,承诺的对象状态的方法是拒绝再回来。如果承诺对象调用的话,那么错误的对象将在onrejected函数的第一个参数。
如果诺言状态的变化来实现,而onfulfilled功能不在那么方法提供的承诺,然后返回的对象的状态变化来实现的方法,并成功的结果是最后的承诺的结果,拒绝是一样的。
此外,两onfulfilled和onrejected异步
执行。
规范的实现:q
以上是承诺的规范,我们需要的是它的实现,而Q是一个对承诺的一个很好的规范。
首先,我们需要
创建一个承诺对象,而承诺对象创建的规范是在诺言B中,没有直接的解释,直接在代码上。
复制代码代码如下所示:
函数(标志){
VaR推迟= q.defer();
fs.readfile(a.txt
如果(ERR)defer.reject(ERR);
其他defer.resolve(数据);
});
返回defer.promise;
}
大多数来实现类似的创建在许下诺言,通过延迟对象承诺的
属性,如果成功获得的值称为defer.resolve(值),如果失败,然后调用defer.reject(原因),承诺的属性可终于回到推迟。这个过程可以理解为defer.resolve来把承诺变成了国家,并称defer.reject转变成拒绝承诺的状态。
当面对一系列连续的异步方法时,如何使用承诺编写漂亮的代码看下面的例子。
复制代码代码如下所示:
promise0.then(功能(结果){)
/ /做
返回结果;
}然后(函数(结果){)
/ /做
返回生机勃勃;
}然后(函数(结果){)
/ /做
}。catch(函数(EX){)
console.log(前);
}。最后(函数(){)
console.log(最终);
});
在上面的代码中,然后只收到OnFulfilled,而捕捉方法(null,然后onrejected),所以只要一系列异步方法只要返回值始终是一个成功的,然后将代码
运行下瀑布,如果任何一个异步方法或异常失败,然后根据的承诺规范CommonJS,将捕获功能实现。Q还提供了最后的方法,和字面的理解是,解决和拒绝将最终在最后执行功能。
它看起来不错,代码更加维护和漂亮,如果你想同时做呢
复制代码代码如下所示:
Q.all({ promise0,生机勃勃,promise2 })。传播(功能(val0,val1,val2){
console.log(参数);
}。然后(函数(){)
console.log(做);
}。catch(函数(错误){)
console.log(ERR);
});
Q还提供了API调用的所有方法的并发性,并通过承诺继续使用当时的链条式数组。有结也很好。JS的
原生API被
转换为保证统一的编码格式,如q.nfbind.more API不
详细的在这里。
结论
本文主要
介绍了承诺解决js控制流的使用问题,但承诺可以应用于前端。emcascript6已经原始API提供
支持。应当指出的是,并不是唯一的解决办法。异步也是不错的选择,并提供更多的并发控制的API。但是我认为在用异步方法封装函数时,承诺有更多的优势。
好的,这篇文章是第一篇,我希望能帮助你。