Javascript异步到同步任务

时间:2013-10-31 11:16:40

标签: javascript jquery asynchronous synchronous

我有以下代码(这些代码在分开的js文件中):

代码1(home.js):

alert('1');
BeginGetDashboardsMethod();
alert('5');

代码2(script.js):

function BeginGetDashboardsMethod(){

var stop = 'false';
alert('2');
try {        
        Service.GetDashboardsMobile("" + curr_cod_user, SuccessGetDashboardMethod, ErrorGetDashboardMethod);

}
catch (e) {

}
function SuccessGetDashboardMethod(result) {
    alert('3');        
    json = result;

    json = JSON.parse(json);        
    ListDashboards(json);
}
function ErrorGetDashboardMethod(err) {
    alert(JSON.stringify(err));
}

function ListDashboards(json) {
    alert('4');
    for (var i = 0; i < json.Dashboards.length; i++) {
        if (json.Dashboards.length === 1)
            Items = "[{key:\'" + json.Dashboards[i].OBV_ST_TITULO + "\', title:\'" + json.Dashboards[i].OBV_ST_TITULO + "\'}]";
        else {
            if (i == 0) {
                Items += "[{key:\'" + json.Dashboards[i].OBV_ST_TITULO + "\', title:\'" + json.Dashboards[i].OBV_ST_TITULO + "\'} ";
            }
            else if (i + 1 == json.Dashboards.length) {
                Items += ",{key:\'" + json.Dashboards[i].OBV_ST_TITULO + "\', title:\'" + json.Dashboards[i].OBV_ST_TITULO + "\'}] ";
            }
            else {
                Items += ",{key:\'" + json.Dashboards[i].OBV_ST_TITULO + "\', title:\'" + json.Dashboards[i].OBV_ST_TITULO + "\'} ";
            }
        }

    }
    obj = eval(Items);
}     }

我的代码异步工作。 Service.GetDashboardsMobile之后调用代码“skip”成功回调并执行alert(5);执行回调时。有没有办法让这些功能同步?

更确切地说,我想要那个序列:alert('1'); - &gt; alert('2'); - &gt; alert('3'); - &gt; alert('4 '); - &GT;警报(' 5' )

1 个答案:

答案 0 :(得分:0)

欢迎来到Promises的新世界。

的script.js

alert("1"); // script 1 loaded

function $dashboard(user) {

  function getDashboard(start, limit) {
    var user = user;

    return new Promise(function(pass, fail) {

       if( Math.random()*3 > 2 ) {
         fail(new Error("boo hoo"));
       } else {
         window.setTimeout(pass, 5000, '{"time": 5000, "content": "foo"}');
       }
    });
  }

  function parseData(json) {
    return new Promise(function(pass, fail) {
      try {
        pass(JSON.parse(json));
      } catch(e) {
        fail(e);
      }
    });
  }

  function printData(data) {
    alert(JSON.stringify(data));
    return true;
  }

  return {
    get: getDashboard,
    parse: parseData,
    print: printData
  };
}

home.js

(function(d,w,$) {

alert("2"); // script 2

var dashboard = $("mcfoobar");

dashboard
  .get(0, 100)
  .then(function(sData) {
     alert("3"); // data retrieved
     return dashboard.parse(sData); 
  })
  .then(function(oData) {
     alert("4"); // data parsed
     return dashboard.print(oData);
  })
  .then(function(result) {
     alert("5"); // data printed
  })
  .catch(function(err) {
    alert(JSON.stringify(err)); // Something went wrong
  });

}(document, window, $dashboard));

备注:

  • 为什么要提醒所有人?当然console.log(..)是一个更好的解决方案。当然少了点击。
  • 您必须确保已加载 script.js 。希望home.js在script.js的el.onload元素上有某种<script>事件。
  • 为了向后兼容,您需要定义Promises以防万一。但这应该很容易实现。如果某个兼容性库中不存在v8版本,则可以使用它。
  • 确保通过在.then()函数中返回不同的值来记录链中值的更改方式。保持原始值只是转发参数。