我有以下代码,它具有以下结构:
doSomething '/', ->
waitForthis '#e', ->
waitForSomethingElse '#el', ->
#actually do it
如果我想使用延迟/承诺是这样的:
doSomething().then(waitForthis).then(waitForSomethingElse);
我会在哪里创建延期,然后每个人都会返回一个承诺?
我只是在寻找一些粗略的建议让我开始。
我可能会使用jquery deferreds。
答案 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及其众多示例。