延迟链承诺

时间:2016-08-03 03:53:10

标签: javascript promise

我正在尝试执行以下操作,但它无法正常工作。如何调整代码以使.then和.done之间有延迟?

    myService.new(a).then(function(temp) {

        setTimeout(function() {
            return myService.get(a, temp);
        }, 60000);
    }).done(function (b) {
        console.log(b);
    });

3 个答案:

答案 0 :(得分:1)

您可以创建一个简单的延迟函数,该函数返回一个promise并在您的promise链中使用它:

function delay(t, val) {
   return new Promise(function(resolve) {
       setTimeout(function() {
           resolve(val);
       }, t);
   });
}

myService.new(a).then(function(temp) {
    return delay(60000, temp);
}).then(function(temp) {
    return myService.get(a, temp);
}).then(function (b) {
    console.log(b);
});

您还可以使用Promise方法扩充.delay()原型(有些人承诺像Bluebird这样的库已经内置了)。请注意,此版本的延迟会传递给链中下一个链接的值:

Promise.prototype.delay = function(t) {
    return this.then(function(val) {
        return delay(t, val);
    });
}

然后,你可以这样做:

myService.new(a).delay(60000).then(function(temp) {
    return myService.get(a, temp);
}).then(function (b) {
    console.log(b);
});

答案 1 :(得分:0)

您可以在.delay()创建一个Promise.prototype函数集,该函数会返回一个具有原始承诺值的新Promise

Promise.prototype.delay = function(t) {
  return this.then(function(data) {
    return new Promise(function(resolve) {
      setTimeout(resolve, t || 0, data);
    })
  })
};

Promise.resolve(123)
.delay(6000)
.then(function(data) {
  console.log(data)
});

答案 2 :(得分:0)

jfriend00的方法略有改进,避免了需要传递解析后的值:

function delay(t) {
  return (val) => {
    return new Promise((resolve, reject) => {
      setTimeout(() => resolve(val), t)
    })
  }
}

可以像这样使用:

myService.new(a)
  .then(delay(60000))
  .then(function(temp) {
    return myService.get(a, temp);
  }).then(function (b) {
    console.log(b);
  });