JS承诺在YDKJS中揭示构造函数

时间:2017-07-26 14:36:13

标签: javascript es6-promise

我正在阅读Async& amp; YDKJS系列的性能书,我在绕着揭示的构造函数模式缠绕我的问题。

这是本书给出的例子:

function foo(x) {
  // start doing something that could take a while

  // construct and return a promise
  return new Promise( function(resolve,reject){
    // eventually, call `resolve(..)` or `reject(..)`,
    // which are the resolution callbacks for
    // the promise.
  } );
}

var p = foo( 42 );

function bar(fooPromise) {
  // listen for `foo(..)` to complete
  fooPromise.then(
    function(){
      // `foo(..)` has now finished, so
      // do `bar(..)`'s task
    },
    function(){
      // oops, something went wrong in `foo(..)`
    }
  );
}

bar( p );

我有两个问题:

  1. 我认为目的不是要向外部公开决策并拒绝逻辑,这会在承诺逻辑与函数中.then()接下来发生的事情之间产生良好的关注分离(在此案件bar())"听"承诺。我在这里吗?

  2. 示例foo()让我感到困惑。在评论// start doing something that could take a while中,究竟是什么?这是您的异步​​调用吗?它不应该在return语句中的函数内吗?我不明白这会如何起作用。

2 个答案:

答案 0 :(得分:1)

  

我认为目的不是要向外界揭露决心并拒绝逻辑,这会产生良好的关注分离

是的,以及在deferred pattern中捕获异常的难度,这是另一种方法,只将解析器暴露给创建任务的函数,而不是那些消耗结果的函数。

  

示例foo()让我感到困惑。在评论// start doing something that could take a while中,究竟是什么?这是您的异步​​调用吗?

是的,这就是他们的意思。

  

它不应该在return语句中的函数内吗?

是的,确实应该如此。具体示例可能是

function delay(x) {
  return new Promise(function(resolve) { // construct and return a promise
    setTimeout(function() { // start doing something that could take a while
      resolve(); // eventually, call one of the resolution callbacks
    }, x);
  });
}

当然可能启动任务并等待其结果是两个单独的陈述,因此它们理论上可以分开:

function ajax(x) {
  var xhr = new XMLHttpRequest();
  xhr.open("GET", x);
  xhr.send(); // start doing something that could take a while

  return new Promise(function(resolve, reject) { // construct and return a promise
    xhr.onload = resolve;
    xhr.onerror = reject; // eventually, call one of the resolution callbacks
  });
}

但这是一种不良做法,因为当newopensend投掷时,您不会得到被拒绝的承诺,而是例外。所以var xhr = …中的所有内容都应该在promise构造函数的回调中。

答案 1 :(得分:-1)

对于2.,一般而言,没有进一步的细节,是的,你是对的;传递给resolver构造函数的Promise函数立即执行。一个例外是使用async/await,但async/await未出现在JavaScript的问题上。