0

我有以下代码(这些代码在单独的 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');-->alert('2');-->alert('3');-->alert('4');-->警报('5')

4

1 回答 1

0

欢迎来到 Promises 的新世界。

脚本.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
  };
}

主页.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()。要保持原始值,只需转发参数。
于 2016-04-05T04:53:18.160 回答