Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript(承诺)之谜_Javascript_Asynchronous_Promise - Fatal编程技术网

javascript(承诺)之谜

javascript(承诺)之谜,javascript,asynchronous,promise,Javascript,Asynchronous,Promise,如果必须使用承诺,您将如何编写以下代码 其思想是“private”方法p1调用执行异步操作的函数,然后,当异步调用的结果就绪时,控制权被传递给“private”方法p2。就像p1,p2调用一个函数,该函数执行一些异步内容,然后将控件传递回p1。在本例中,这将永远持续下去 您可以想象,我已经将代码简化为一个更具理论性的场景,使其简短。实际上,p1和p2正在做两件不同的事情,并且基于p1和p2中的某些条件,程序执行确实会停止 mySimpleRunner = (function () { va

如果必须使用承诺,您将如何编写以下代码

其思想是“private”方法
p1
调用执行异步操作的函数,然后,当异步调用的结果就绪时,控制权被传递给“private”方法
p2
。就像
p1
p2
调用一个函数,该函数执行一些异步内容,然后将控件传递回
p1
。在本例中,这将永远持续下去

您可以想象,我已经将代码简化为一个更具理论性的场景,使其简短。实际上,
p1
p2
正在做两件不同的事情,并且基于
p1
p2
中的某些条件,程序执行确实会停止

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();
我已经尝试了许多可能的方法来对承诺执行相同的操作,其中,async不是将函数
cb
传递给async,而是在计时器完成时解析的承诺。但我还没有弄明白如何正确地做到这一点


如果你有时间,想尝试一下,我会非常感激。

真的没什么不同。唯一的问题是将回调传递给
,如果
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);
}

其实差别不大。唯一的问题是将回调传递给
,如果
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);
}
仅供参考,
function(){resolve(n);}
也会做同样的事情。仅供参考,
function(){resolve(n);}
也会做同样的事情。