gpt4 book ai didi

javascript - 我怎样才能延迟一个函数的执行,直到其他两个使用 $q 完成?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:48:16 24 4
gpt4 key购买 nike

我正在使用 $q 的 AngularJS 实现。

给定以下功能:

   doTask1: function ($scope) {
var defer = $q.defer();
$http.get('/abc')
.success(function (data) {
defer.resolve();
})
.error(function () {
defer.reject();
});
return defer.promise;
},

doTask2: function ($scope) {
var defer = $q.defer();
var x = 99;
return defer.promise;
},

我知道我可以像这样延迟执行另一个函数:

os.doTask1()
.then(function () {
doTask3();
});

我想同时启动 doTask1 和 doTask2。有没有办法我可以做到这一点并仍然延迟执行,以便doTask3() 在 doTask1 和 doTask2 结束之前不会执行成功。

最佳答案

$q.all 就是您要找的。 ( Documentation )

$q.all 采用数组或对象形式的多个 promise ,并返回一个全新的 promise ,当所有传入的 promise 都得到解决时,该 promise 将得到解决。如果您传入一组 promise ,则新 promise 将使用与这些 promise 相对应的一组值进行解析:

$q.all([doTask1(), doTask2()]).then(function(results) {
// results[0] == result of doTask1
// results[1] == result of doTask2
doTask3();
});

如果你传入一个键- promise 对的对象,它将被一个对象解析,该对象的键与你传入的对象匹配,每个值都很好地对应于该键的已解析 promise 的值:

$q.all({one: doTask1(), two: doTask2()}).then(function(results) {
// results.one == result of doTask1
// results.two == result of doTask1
doTask3();
});

由于 promise 链(例如,当您从 then 函数返回一个 promise 时,它​​会创建一个新的 promise,解析为您返回的 promise 的解析值),您可以做一些很酷的事情东西:

var bothPromises = $q.all([doTask1(), doTask2()]);

var task3Promise = bothPromises.then(function(results) {
var result1 = results[0];
var result2 = results[1];
return doTask3(result1, result2);
});

task3Promise.then(function(resultOfDoTask3) { ... });

毫无值(value)的是,如果传递给 $q.all 的任何 promise 被拒绝,则返回的 promise 也将被拒绝。参见 the Angular $q documentation获取更多信息。


这(几乎)与问题无关,但我认为这是一个巧妙的技巧:如果您碰巧使用 CoffeeScript,则可以使用解构来获得 promise 的已解析值。

对于数组:

$q.all([doTask1(), doTask2()]).then ([result1, result2]) ->
# ...

对于对象

$q.all(one: doTask1(), two: doTask2()).then ({one, two}) ->
# note that you have to use the same key names
# as in the object you passed to `$q.all`

关于javascript - 我怎样才能延迟一个函数的执行,直到其他两个使用 $q 完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21772454/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com