从延迟的回调中返回承诺
Returning a promise from within a deferred's callback
我正在做一些任何事情,我真的很想以良好的方式实现它。
请考虑以下代码
function getData(latency) {
var deferred = $.Deferred();
window.setTimeout(function () {
deferred.resolve(Math.random());
}, latency + 100);
return deferred.promise();
}
function getSpecialData() {
var deferreds = [];
for (var i = 0; i < 3; i++) {
deferreds.push(getData(1000 * i));
}
return $.when.apply($, deferreds);
}
function log(msg) {
$("#console").append("<li>" + msg + "</li>");
console.log(msg);
}
getData(3000)
.done(function () {
log("got 3000 data");
return getSpecialData()
.done(function () {
log("got special data");
});
})
.always(function () {
log("got all data");
});
如您所见,我从getData和getSpecialData函数中返回了一个承诺。我还以您看到的方式链接对这些函数的调用。更重要的是,我从getData done回调中返回一个承诺。
我一直期望延迟对象关心它的回调返回什么,如果它是一个承诺,请等待该承诺解决,然后是另一个回调。实际发生的是,它不关心我在回调中返回的内容。顺序是:
- 调用getData,3秒后获取
"got 3000 data"
信息, - 同时触发getSpecialData和
always
回调"got all data"
消息
我想要实现的是以下函数调用顺序:
- 调用getData,3s后获取
"got 3000 data"
信息, - 调用getSpecialData,3s后获取
"got special data"
信息, - 紧接着
"got all data"
消息。
让它按照我想要的方式工作的最佳方法是什么?
这正是
.then()
(或jQuery 1.8之前的.pipe()
(所做的。
称之为而不是.done()
.
你不能从回调中return
任何东西,因为这毫无意义 - 结果不会在调用方的任何地方使用,它的类型实际上是void
的。
要链接操作,您可以使用 then
而不是 done
。该方法将为回调的(异步(结果返回一个承诺,该结果本身可以是一个承诺。
相关文章:
- 谷歌日历 api 调用可以在角度工厂内返回承诺吗?
- JavaScript - 返回承诺和/或调用回调
- 在同一函数中解析承诺后返回承诺
- 承诺返回承诺
- 承诺返回承诺
- 如何从多个承诺中返回承诺
- 如何使用在 AngularJS 中返回承诺的$resource测试工厂
- 这是一种常见的模式吗?(返回数据而不是返回承诺)
- 使用 Jasmine 2.4.* 测试返回承诺的服务
- 承诺回调返回承诺
- 可以 Angular 模板调用函数返回承诺
- 链接返回承诺数组的函数
- 使用属性从指令返回承诺
- 节点.js SQLite 3 返回承诺
- 从延迟的回调中返回承诺
- 返回承诺与返回承诺内未定义之间的区别
- 返回承诺值
- 如何在返回承诺的服务中创建 reset() 方法
- 从顺序 jQuery ajax 调用返回承诺
- 在 Redux Thunk 发货后从商店返回承诺