Javascript 节点js中的可读异步代码流

Javascript 节点js中的可读异步代码流,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我不熟悉node js中的异步编程,想知道如何将我以前的同步编程转换为node js中可读的异步编程。特别是这个例子: function getDefaultValue1() { return getDefaultValue1FromDB(); }; function getDefaultValue2() { return getDefaultValue2FromDB(); }; function doSomething(var optionalValue1, var opti

我不熟悉node js中的异步编程,想知道如何将我以前的同步编程转换为node js中可读的异步编程。特别是这个例子:

function getDefaultValue1() {
    return getDefaultValue1FromDB();
};
function getDefaultValue2() {
    return getDefaultValue2FromDB();
};

function doSomething(var optionalValue1, var optionalValue2){
    try {
        if(optionalValue1===null){
            optionalValue1 = getDefaultValue1();
        }
        if(optionalValue2===null){
            optionalValue2 = getDefaultValue2();
        }
        var resultList = [];
        for(var i = 0; i < optionalValue2; i++) {
            resultList.push(functionWithDbCall(optionalValue1, i));
        }
        return doSomeCalculations(resultList);
    }catch(var e){
        //log exception
        return null
    }
};
请注意,在节点js getDefaultValue1FromDBvar回调、functionWithDbCallvar optionalValue1、var i、var回调中,所有DB调用都是异步的

我的想法是: 将回调参数添加到getDefaultValue=>需要在回调中和if之后使用相同的代码。For循环在调用回调之前退出,回调需要处理调用它们的频率,并检查以正确的顺序推送项。将函数更改为使用异步方法需要在调用它的任何地方更改代码,就像将getDefaultValue从返回常量int更改为DB调用一样

我被困在这里,我所发现的一切都是在为一些库或不可读代码做广告,比asm或regex写一次更糟糕,再也不会读/触摸了。我是否错过了node js学习材料中的一些基本内容,或者这是该语言的设计失败


因此,我希望有人能告诉我如何使用async node js编写这个简单的可读函数。

我建议使用Bluebird:

var承诺=要求“蓝鸟”; /** *让我们假设getDefaultValue1FromDB传递回调fn; *@return{Promise} */ 函数getDefaultValue1{ 返回新的允诺函数解析、拒绝{ 返回getDefaultValue1FromDBfunctionerr,值{ 如果错误返回rejecterr; 返回值; }; }; } /** *让我们假设getDefaultValue2FromDB传递回调fn; *@return{Promise} */ 函数getDefaultValue2{ 返回新的允诺函数解析、拒绝{ 返回getDefaultValue2FromDBfunctionerr,值{ 如果错误返回rejecterr; 返回值; }; }; } /** *@param{Promise | int}可选值1 *@param{Prommise|int}可选值2 *@return{Promise} */ 函数doSomethingoptionalValue1,optionalValue2{ ifoptionalValue1==null optionalValue1=getDefaultValue1; ifoptionalValue2==null optionalValue2=getDefaultValue2; 回报承诺 .全部[可选值1,可选值2] .val1,val2{ var resultList=[]; forvar i=0;i您可能希望使用ES7计划书中的一个未来版本的JavaScript。请参阅关于如何从回调迁移到承诺到异步/等待


要在今天实际运行将来的代码,您需要使用将其编译为当前支持的功能。另外,它可以做的比async/await更好。

bluebird是在async.js之外遇到的库之一。那么可读代码只能通过外部库实现?我想我没有在问题中明确说明它将在异步时使用dbcallval1,I,callback函数,还是要使用与getDefaultValue1相同的模式?您可以在es6的节点中使用本机承诺,但不知道它们是否相同。我编辑了答案,您可以在DoMeMeCalCurraseSyc中包装DOMMECCALCUTION,在那里您将通过函数调用DeBuffe返回的所有承诺,一旦获得了所有这些承诺,继续计算。我必须考虑代码中的承诺作为返回值吗?因为你没有使用它们。然后在函数中。如何访问该值?您可以有一个承诺数组,即:[returnsAPromise,Promise.resolvefoo,250,foo],事实上,像foo这样的值将被视为一个已解决的承诺,比如Promise.resolvefoo。然后可以将该数组传递给Promise.all或Promise.each,以此类推。我建议您阅读Bluebird异步代码,它一点也不难阅读。你只是不习惯。我从1999年开始在Tcl中编写异步代码,所以当ajax出现时,我会说:嘿,这很熟悉!当node.js出现时也发生了同样的事情,我想:嘿,这就像在浏览器中编码一样!您不习惯的代码/设计模式在开始时总是难以理解。如果你去PICLIST论坛,你会发现有些人不会碰C,因为for循环和If/else都很混乱——他们只在汇编中编程。问题是,异步代码很快。这就是javascrip的特点
我以前的工作是在诺基亚使用异步I/O维护用C编写的数据库代码,以获得电信公司期望的电话目录吞吐量。如果你拒绝习惯异步代码,你将永远无法利用它的优势。另一方面,一旦得到它,您就可以用任何语言编写异步代码。Javascript只能使异步代码具有高度可读性。尝试使用状态机在C中的while循环中实现为switch case语句,这样做会更加混乱。@slebetman我习惯于使用pthreads et alii和多线程和互斥体进行异步编程,每个程序执行1-10次。在NodeJS中,每个函数执行1-10次。类似ifx{A}的代码;B变成ifx{AB};B重复B和类似for循环中的有序异步之类的事情真的让我心烦意乱。它完全颠倒了代码流、思维和可读性,你突然发现每个for循环有5行样板代码。甚至asm也有直接的代码流。很好,我使用了XC866,它通常用C编程,在asm中只有中断表,但只有256字节的RAM;因为我想把它学好,所以我问了一个问题:别人是怎么做的,而不是一直做错事。多线程编程和异步编程是不一样的。异步编程几乎100%都是单线程的,也有node.js磁盘I/O之类的例外。在大学里,我学习了线程和选择。这当然是用C语言编写的——js当时不在我们的集体雷达上。我希望该提案能尽快定稿并合并,因为我的一个简单的express应用程序的node_模块文件夹已经有30MB了,并且需要一分钟的时间启动,因为每件事都需要100个模块。尽管返回语句对于像我这样缺乏回调语言经验的人来说似乎有误导性,但它看起来非常干净。稍后我会仔细看一看。