dic*_*oce 9 javascript asynchronous
在开发移动PhoneGap应用程序时,我遇到了一个有趣的问题.我需要从数据库中查询大约10项数据(通过PhoneGaps SQLite API)...像许多javascript API一样,这个是异步的.在进行查询时,您将传入"成功"处理程序.
现在,我在这种情况下的偏好是一个同步查询方法,只有在完成时才返回.然后我可以编写直线代码,一个接一个地查询10个项目中的每一个.
由于PhoneGap的异步特性(实际上,我在JS中看到了这一点)我被迫写了一个看起来像这样的野兽:
db.query( "SELECT...", success() {
db.query( "SELECT...", success() {
db.query( "SELECT...", success() {
db.query( "SELECT...", success() {
db.query( "SELECT...", success() {
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这只是我必须去的一半(并且大大简化了......)......当我在C中使用SQLite时,我可以简单地完成以下操作:
db.query( "SELECT...", resultA );
db.query( "SELECT...", resultB );
db.query( "SELECT...", resultC );
db.query( "SELECT...", resultD );
db.query( "SELECT...", resultE );
Run Code Online (Sandbox Code Playgroud)
在我看来,当你只需要深入1或2级时,成功处理程序的方法很棒...但是,当你需要更多时,完全崩溃......
他们的图书馆或图书馆的某个功能是否使这更容易?
这是一个在社区中非常普遍的问题,因此出现了许多模式和库来对抗它.
我最喜欢的是承诺.我做了一个关于promises的演示文稿,作为一些事件中异步问题的解决方案; 你可以查看SlideShare上的幻灯片:Callbacks,Promises和Coroutines(哦,我的!):JavaScript中异步性的演变.它还解释了为什么异步性是必要的 - 简而言之,因为JavaScript是单线程的.
有关您提供的特定示例,请查看幻灯片53及其附近.简而言之,假设db.query返回了一个承诺,它看起来像:
db.query("SELECT...")
.then(function (a) {
return db.query("SELECT..." + a);
})
.then(function (b) {
return db.query("SELECT..." + b);
})
.then(function (c) {
return db.query("SELECT..." + c);
})
.then(function (d) {
return db.query("SELECT..." + d);
})
.then(function (e) {
return db.query("SELECT..." + e);
});
Run Code Online (Sandbox Code Playgroud)
当然,如果您不需要为下一个使用一个查询的结果,它会变得更好:
Q.all([
db.query("SELECT..."),
db.query("SELECT..."),
db.query("SELECT..."),
db.query("SELECT..."),
db.query("SELECT...")
]).spread(function (a, b, c, d, e) {
// ...
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6774 次 |
| 最近记录: |