高级延期/承诺建议

时间:2012-12-10 22:34:27

标签: javascript

我有以下代码,它具有以下结构:

doSomething '/', ->
  waitForthis '#e', ->
    waitForSomethingElse '#el', ->
      #actually do it

如果我想使用延迟/承诺是这样的:

doSomething().then(waitForthis).then(waitForSomethingElse);

我会在哪里创建延期,然后每个人都会返回一个承诺?

我只是在寻找一些粗略的建议让我开始。

我可能会使用jquery deferreds。

3 个答案:

答案 0 :(得分:0)

(假设是jQuery)

为了确保链接,每个步骤都需要返回一个承诺。

那就是then()所做的,所以这里没问题。

doSomething()还需要返回一个promise。你可以通过让doSomething()创建一个延迟,并返回它的诺言来做到这一点。

一些jQuery函数已经包含了deferred,你可以用then()直接链接它们。例如:

$.ajax(...).then(...)

查看this article了解更多详情和实例。

答案 1 :(得分:0)

如果你正在寻找类似的东西:

Send request A
when A returns,
Send request B(result a)
when B returns,
Do C(response b)

然后你需要让每一个都成为一个承诺,你需要注意闭包(因为你不能从回调中收集返回值)。

a_done = something_that_returns_a_promise();
a_done.then(function (a_result) {
    var b_done = something_that_returns_a_promise(a_result);
    b_done.then(function (b_result) { do_C(b_result); });
});

如果您正在寻找类似

的内容
Send request A
Send request B

when A && B return,
Do C

然后,您正在查看将承担许多承诺的函数,并返回承诺。

a = something_returning_a_promise();
b = something_returning_a_promise();
a_and_b_done = when(a, b);

a_and_b_done.then(function (result1, result2) { do_c(result1, result2); })
            .then(show_results);

做类似

的事情
a_done.then(fillRows).then(showResults);

不允许你进行多次异步调用......它的作用是允许你一个接一个地链接一堆同步任务(或者在他们到达的顺序中进行异步调用而不是#总而言之。)

.then

.done

或者其他什么,没有做任何特别的事情 - 它为一个数组添加了一个任务 当async promise返回时(或者它已经返回并且已经解决),它只是按顺序遍历该列表,并触发所有回调,传递它所解析的任何数据(并调用&# 34;成功"或"失败"回调,基于操作的成功)。

所以你需要为每个异步回调提供一个承诺,如果你试图将回调链接在一起,你仍然需要将每个回调包装在一个闭包内(闭包会将结果传递给构建你的任何东西)下一个承诺)。

我正在使用jQuery $.Deferred()deferred.promise()deferred.resolve()deferred.reject()promise.done()promise.fail()和{{1这里:
其他库可能有不同的术语,但表现相似。

$.when()

这是一个混乱而复杂的例子,但我并没有把它变得优雅,我想我会尝试以一种显示所有部分的方式来编写它。

答案 2 :(得分:0)

  

类似的东西:

     

doSomething().then(waitForthis).then(waitForSomethingElse);

它宁愿是

doSomething('/').then( function() {
    return waitForthis('#e');
}).then( function() {
    return waitForSomethingElse('#el');
});

或者您使用.bind()

  

我会在哪里创建延期,然后每个人都会返回一个承诺?

是的,每个函数都会返回一个承诺。在jQuery中," Deferred"是延迟对象的构造函数,调用" promise()"返回仅具有addCallback函数的对象,但不公开触发器方法。只需查看the docs及其众多示例。