javascript(承诺)拼图

时间:2016-02-10 12:30:03

标签: javascript asynchronous promise

如果必须使用Promises,您会如何编写以下代码?

这个想法是"私人"方法p1调用一个异步执行某个函数的函数,然后,当异步调用的结果准备就绪时,控件被传递给" private"方法p2。就像p1一样,p2调用执行某些异步内容的函数,然后将控件传递回p1。在这个例子中,这将永远持续下去。

正如您可以想象的那样,我已经将我的代码归结为一个更理论化的场景,以简化它。在实践中,p1p2正在做两件事,根据p1p2中的某些条件,程序执行会停止。

mySimpleRunner = (function () {

  var service = {}; 

  var async = function (cb) {
    var n = Math.floor(Math.random() * 1000);
    setTimeout(function () {
      cb(n);
    }, n); 
  }

  var p1 = function (r) {
    async(p2);
    console.log("1:", r || "first call");
  };  

  var p2 = function (r) {
    async(p1);
    console.log("2:", r); 
  };  

  service.run = function () {
    p1();
  }

  return service;

})();

mySimpleRunner.run();

我已尝试过许多可能的方法来使用Promises,而不是将函数cb传递给异步,async是一个在计时器完成时解析的Promise。但我还没弄清楚如何正确地做到这一点。

如果你有某个时间并想尝试一下,我真的很感激。

1 个答案:

答案 0 :(得分:3)

真的不是很多不同。唯一的问题是,如果then

,则将回调传递给async
function async() {
    return new Promise(function (resolve) {
        var n = Math.floor(Math.random() * 1000);
        setTimeout(resolve.bind(null, n), n);
    });
}

function p1(r) {
    async().then(p2);
    console.log(r);
}

function p2(r) {
    async().then(p1);
    console.log(r);
}