javascript异步函数的开发
现在,让我们回顾一下多年来Javascript异步函数的发展。
回调函数回调
似乎一切都应该从回调函数开始。
异步Javascript
我们都知道,在Javascript中,异步编程风格只有公民能作用于Javascript语言来完成的:这意味着我们可以把一个函数作为另一个函数的参数,在这个函数可以在函数调用中传递(即回调函数)。这就是为什么回调函数:如果你是天生的将一个函数作为另一个函数的参数(当它被称为一个高阶函数),然后你就可以调用这个函数内部的函数来完成相应的任务。回调函数不返回值(不要尝试使用返回),仅用于在函数执行某些操作。看看一个例子:
Something.save(功能(ERR){)
如果(错误){
错误处理
返回;没有返回值
}
console.log(''成功');
});
在上面的例子中,我们展示了一个错误,第一次回调与错误的优先级,这是一个对Node.js本身的特点。所有的核心模块在Node.js和大多数模块在NPM仓库将遵循这一特征的时候写的。
过度使用回调函数的挑战:
如果你不能合理地组织代码,那么很容易引起回调,这使得你的代码很难被别人理解。
很容易忽略错误处理代码。
不能使用返回语句返回值,不能使用抛出关键字。
正是由于这些原因,Javascript世界一直在寻找可行的解决方案,从而使得异步Javascript的开发变得更加简单。
其中的一个可行的解决方案是异步模块。如果你做生意和回调函数打了很长一段时间,你会深深地感到,在Javascript中如果你想让事情并行或串行实现,即使使用异步函数映射(映射)使用异步函数的数组元素更加复杂。所以,谢谢Caolan McMahon写的异步模块来解决这些问题。
与异步模块,你可以按下面的方式写代码:
Async.map({ 1, 2, 3 },AsyncSquaringLibrary.square,
函数(错误,结果){
将是结果{ 1, 4, 9 }
});
The async module, to some extent, has brought convenience, but it is still not easy enough and the code is not easy to read, so Promise appears.
承诺
目前Javascript异步标准可以追溯到2012,它没有成为直到6。然而,长期的承诺不通过Javascript社区发明的。这个词来自Daniel P.friedman在1976发表的一篇文章。
承诺表示异步操作的最终结果。
现在我们使用承诺来完成上面代码所完成的任务,并且承诺样式代码如下所示:
Something.save()
然后(函数(){())
console.log(''成功');
})
catch(函数(){())
错误处理
})
在回调中,回调函数也被使用,在catch和catch方法中引入回调函数,分别在承诺满足和拒绝时执行,另一个优点是它可以链接完成一系列的任务:
SaveSomething()
然后(updateotherthing)。
然后(deletestuff)。
然后(logresults);
当你没有一个现成的承诺,你可能需要使用一些承诺的图书馆,和一个受欢迎的选择是使用蓝鸟。这些图书馆可以提供的功能比本地解决方案的更多,不限于受许指定的功能/ +标准。
但是你为什么不使用糖的方法呢建议您先阅读承诺这篇文章:扩展问题。
您可能会问:如果大多数库只公开回调接口,那么如何使用诺言呢
这是非常简单的,此时惟一需要做的就是使用回调函数包装回调函数:
代码的回调样式可能如下所示:
功能savetothedb(值){
Db.values.insert(价值、功能(呃,用户){
如果(错误)抛出错误;
将用户插入到:
});
}
现在我们将它转换为支持承诺样式调用的代码:
功能savetothedb(值){
返回新的承诺(函数(解析,拒绝){
Db.values.insert(价值、功能(呃,用户){ / /记住错误第一;)
如果(错误){
返回拒绝(错误);请不要忘记返回这里。
}
解析(用户);
})
}
}
已经有两种方式来支持回调风格的同时提供相当数量的库或框架,保证风格的API接口。所以现在,如果你想去外面的世界提供了一个图书馆,最好的做法是同时提供两个接口。你可以用以下方式为了实现这一目标:
函数(CB){
如果(CB){
返回CB();
}
返回新的承诺(函数(解析,拒绝){
});
}
或者更简单,你可以从界面,只提供承诺的风格开始,和使用像callbackify工具实现向后兼容性的目的。事实上,Callbackify也同样是上面的代码片段,但它采用更一般的方法实现。我建议你读callbackify源代码。
发电机发电机/产量
Javascript生成器是一个相对较新的概念,这是6新功能(也被称为es2015)。想象这样一个场景:
当你执行一个函数时,你可以在某个时刻暂停函数的执行,然后做一些其他的工作,然后返回这个函数,继续执行,甚至执行一些新的值,然后继续执行。
上面描述的场景正是Javascript函数发生器是专门的问题。我们称之为发电机的功能时,它不会立即执行,但需要我们进行迭代操作(接法)手动,你调用生成函数,它返回给你一个迭代器迭代器遍历每个休息点。
函数*(){
var指数= 0;
当(索引< 2){
收益率指数+ /暂停功能,收益率操作后
}
}
var(bar);返回实际上是一个迭代器。
Console.log((酒吧。下)); / / { 0 },价值:假
Console.log((酒吧。下)); / / { 1 },价值:假
Console.log((酒吧。下); / /定义):{ },真正的价值:
此外,如果您希望使用生成器函数更容易编写异步Javascript代码,我们可以使用联合库。CO是著名的TJ神写的。
公司是一个基于发电机Node.js和浏览器的过程控制工具。有了承诺,您可以以更优雅的方式编写非阻塞代码。
使用前面示例代码的CO,我们可以使用以下代码重写:
函数(*){()
Yield Something.save();
}。然后(函数(){)
成功
})
catch(函数(错误){)
错误处理
});
你可能会问:你如何并行操作答案可能比你想象的要简单,如下所述(实际上是承诺):
{ something.save产量(),Otherthing.save()};
异步/等待
异步函数的概念引入ES7(尚未正式标准化)。如果你想使用它,你可以把它变成ES5代码语法转换器通天手段。(提醒:我们现在谈论的是async关键字,而不是在NPM异步封装)。
总之,与异步关键字,你可以很容易地实现所做的工作,在使用发电机和有限的功能。当然,除了黑客。
也许你会问,如果产量不如果你在ES7具有异步关键词如此重要
事实上,异步使用收益率只是一个漏洞,收益率意味着懒惰的顺序(懒惰的序列)和迭代器。首先,让产量使用它的最初用途,然后使用等待执行异步操作。
在这背后,异步功能实际上使用的承诺,这就是为什么异步函数返回一个承诺。
因此,我们使用异步函数做的工作是类似以前的代码,你可以重写代码,用下面的方法:
异步功能保存(某物){
{试
等待(保存某物);等待等待后面的代码执行,类似于收益率。
} catch(前){
错误处理
}
console.log(''成功');
}
你可以看到,使用异步功能,你需要在函数声明的前面加上异步的关键。之后,您可以使用等待函数内的关键词,这是类似于以前的产量。
使用异步函数来完成并行任务是学会非常相似。唯一不同的是,promise.all不再隐。
异步功能保存(某物){
等待的承诺。所有{ Something.save()()、Otherthing.save()}
}
膝关节骨性关节炎也支持异步功能,如果你使用的是膝关节骨性关节炎,现在你可以使用这个功能与巴别塔的帮助。
从进口膝关节骨性关节炎膝关节骨性关节炎;
让应用程序= KOA();
app.experimental =真;
app.use(异步函数(){)
this.body =等待promise.resolve(读者你好!!)
})
(3000)app.listen;
以上内容共享javascript异步函数开发过程,希望对您有所帮助。