有没有办法在Javascript中顺序执行语句?

时间:2011-12-21 00:33:24

标签: javascript

很多次,我必须写一个回调函数。

  

示例1:   myTransaction.executeSql(语句,参数,mySuccess,myError);

     

示例2:$ .getScript(url [,mySuccess])

问:有没有办法告诉JavaScript,“请执行这行代码,当你完成后,执行下一行代码”?

我不想锁定浏览器会话,我只是希望它在完成之前不运行下一行。

5 个答案:

答案 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://blogs.msdn.com/b/ie/archive/2011/09/11/asynchronous-programming-in-javascript-with-promises.aspx

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或嵌套回调更多的优势。