3

最近我读到一篇关于早期 jQuery Promises/A 模式的缺点的文章:

像 jQuery(1.8 之前)这样的库不会这样做:它们只是改变现有 Promise 的状态。这意味着如果您向多个消费者做出承诺,他们可能会干扰其状态。要意识到这有多荒谬,请考虑同步并行:如果您将一个函数的返回值提供给两个人,其中一个人可能会以某种方式将其更改为抛出的异常!

我想用代码来实现这个缺点,我试过了:

<html>
<head>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.0/jquery.min.js"></script>
<script type="text/javascript">

    var promise = $.get("http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js");

    var promise1 = promise.then(function (result) {
        return "Hello";
    });

    promise1.then(function (result) {
        console.log("in promise1 ------>", result.length);
    })

    var promise2 = promise.then(function (result) {
        return "World";
    })

    promise2.then(function (result) {
        console.log("in promise2 ------>", result.length);
    })
</script>
</head>
...

似乎不起作用,我怎样才能实现上述文章中描述的情况?

4

1 回答 1

1

好吧,这样的事情在 1.8 之前将不起作用,.then只有 - .pipe

function doStuff() {
  promptAsync("What url you want to fetch?").then(function (url) {
    return $.get(url)
  }).then(function (contents) {
    return confirmAsync("Here are the contents " + contents + ". Is this ok?")
  }).then(function (confirmation) {
    if (!confirmation) {
      return doStuff();
    }
    return alertAsync("I am glad you are happy with these results");
  });
}

这与同步等效项平行:

function doStuff() {
  var url = prompt("What url you want to fetch?");
  var contents = $.get(url);
  var confirmation = confirm("Here are the contents " + contents + ". Is this ok?");
  if (!confirmation) {
    doStuff();
  } else {
    alert("I am glad you are happy with these results");
  }
}

当然,即使在 1.8 之后,任何抛出的错误都不会从 Promise 中获得,.fail而是会使你的页面崩溃。

于 2013-10-11T22:26:40.357 回答