【问题标题】:How to delay promise execute after defer is resolve延迟解决后如何延迟承诺执行
【发布时间】:2016-06-30 15:31:23
【问题描述】:

我使用 Angular $q 创建了一个这样的延迟对象:

var defer = $q.defer();
var promise = defer.promise;

setTimeout(function(defer){
    defer.resolve("nothing");
},2000,defer);

promise.then(function(){
    //code here
});

所以promise中的代码会延迟2秒,但是我想知道defer解决后如何延迟代码执行,这样我可以这样延迟代码执行:

promise.delay(1000);

当我得到 $http.post() 的承诺时

var promise = $http.post()...;
promise.then(function(){
     // code 
});

如何延迟代码执行,因为 promise 已解决。

【问题讨论】:

  • “延迟解决后”是什么意思?你指的是哪个defer
  • @kazenorin var defer = $q.defer();这个延迟,并且在 settimeout 中延迟从 out 传递过来。

标签: javascript promise angular-promise


【解决方案1】:

您应该使用$timeout 而不是setTimeout,这还有一个好处是已经返回了一个承诺。

要在初始承诺解决后才开始延迟,只需将其放在 then 回调中:

promise.then(function(){
    return $timeout(2000)
}).then(function(){
    //code here
});

【讨论】:

  • 谢谢。它运作良好。当我这样写“ var promise1 = promise.then(function(){ return $timeout(2000) }); return promise1;”
  • 您可能希望传递第一个 Promise 中的数据,以便最后一个 .then() 可以访问第一个 Promise 中的值。
  • @jfriend00:虽然角度看起来很丑:promise.then(x => $timeout(()=>x, 2000))
【解决方案2】:

只需将此代码放入您的旋转块中即可。

setTimeout(() => {
   //Code goes here.
},delayTime);

delayTime 是延迟的毫秒数。

【讨论】:

  • 谢谢。但不是我想要的。
【解决方案3】:

你需要类似以下的东西:

var result = $q.defer();

$timeout(function() {
    result.resolve('nothing');
}, 2000);

return result.promise;

然后在你需要的地方

result.then(function(result) {
    // if you need to delay the result handling then you need another $timeout call here like so:
    $timeout(function() {
        // do something with result
        $scope.result = result;
    }, 1000);
});

编辑:包含另一个 $timeout 调用以延迟处理已解决的承诺

【讨论】:

  • 现在我就像你说的那样做。但我的问题是如何更改结果的延迟时间。
  • 我不确定我是否理解你的需要,但我会更新我的答案
猜你喜欢
  • 1970-01-01
  • 2015-03-08
  • 2015-12-23
  • 2015-03-27
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多