承诺将在NodeJS使用异步函数

承诺将在NodeJS使用异步函数
在写作过程中不断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。但是我认为在用异步方法封装函数时,承诺有更多的优势。

好的,这篇文章是第一篇,我希望能帮助你。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部