很多次,我必须写一个回调函数。
问:有没有办法告诉JavaScript,“请执行这行代码,当你完成后,执行下一行代码”?示例1: myTransaction.executeSql(语句,参数,mySuccess,myError);
示例2:$ .getScript(url [,mySuccess])
我不想锁定浏览器会话,我只是希望它在完成之前不运行下一行。
答案 0 :(得分:5)
将调用放入mySuccess处理函数中的第二个函数以进行第一个函数调用。当第一个完成并运行mySuccess函数时,该函数将调用第二个函数。这是对异步操作进行排序的设计模式。
您无法使用异步操作编写正常的顺序函数调用。您必须使用完成功能进行排序。
以下是使用第一个函数的匿名成功处理程序的示例:
myTransaction.executeSql(stmt,parameters,function() {
$.getScript(url, mySuccess);
}, myError);
答案 1 :(得分:2)
没有办法让你想要什么。但是你可以使用一个有助于降低这一点的库,比如Step:https://github.com/creationix/step
Step(
function() { myTransaction.executeSql(stmt, parameters, this, myError) },
function() { $.getScript(url, this); },
function() { alert('done'); }
);
或者您需要手动嵌套回调。
答案 2 :(得分:1)
Javascript库Step提供了一个框架,用于封装@ jfriend00建议的解决方案。
答案 3 :(得分:1)
如前所述,您可以在步骤1的成功/完成回调中添加第2步的呼叫。
或者您可以查看承诺/延期范例。这有点复杂,所以我不会在这里简明扼要地解释它(并且弄错了)。但鉴于您似乎已经在使用jQuery,您可以使用它的the deferred
object实现。以下是您可以阅读的几篇文章(尽管您可以在Google上找到更多内容):
http://joseoncode.com/2011/09/26/a-walkthrough-jquery-deferred-and-promise/
http://www.infoq.com/articles/surviving-asynchronous-programming-in-javascript
答案 4 :(得分:1)
Frame.js是另一个类似于Step的库,它可以雄辩地解决这个问题,并提供了比setTimeouts或嵌套回调更多的优势。