JS异步请求之间的人为延迟

时间:2016-11-13 00:24:20

标签: javascript node.js asynchronous

我试图找到一种方法来在请求之间引入一些延迟。基本上我有一个名为likePhotos的异步方法,它迭代一组照片并为每个照片调用likePhoto()。我不想在同一时间关闭所有这些,而是​​希望在每次调用likePhoto之间有第二次延迟,然后一旦完成就最终返回给调用者。

async likePhotos(photos) {
  // Run the function over all photos
  var likes = photos.map(function(p, index, photos){
     this.likePhoto(p);
  }, this);

  return Promise.all(likes);
}

likePhoto(p) {
  let { token } = this.state;

  return new Promise(function(resolve, reject) {

    Http
    .post('/api/photos/' + p.id + '/likes', {}, { Authorization: 'Bearer ' + token })
    .then((response) => {
      console.log("YEAH");
      resolve();
    })
    .catch((error) => {
      console.log("Failed to like photo: " + p.id);
      reject(error.message);
    })
  });
}

setTimeout似乎不太合适。我是一个JS菜鸟所以任何建议都将非常感谢!

3 个答案:

答案 0 :(得分:0)

您可以在setTimneout()内使用likePhoto; return this.likePhoto() index传递给1000乘以.map() likePhotos() async likePhotos(photos) { // Run the function over all photos var likes = photos.map(function(p, index, photos) { // return from `.map()` callback return this.likePhoto(p, index); }, this); return Promise.all(likes); } likePhoto(p, index) { let { token } = this.state; return new Promise(function(resolve, reject) { Http .post('/api/photos/' + p.id + '/likes', {}, { Authorization: 'Bearer ' + token }) .then((response) => { console.log("YEAH"); setTimeout(function() { resolve(); }, 1000 * index); }) .catch((error) => { console.log("Failed to like photo: " + p.id); reject(error.message); }) }); } 内的当前索引

R = [
    ctheta*cpsi,
    -cphi*spsi + sphi*stheta*cpsi,
    sphi*spsi + cphi*stheta*cpsi;
    ctheta*spsi, cphi*cpsi + sphi*stheta*spsi,
    -sphi*cpsi + cphi*stheta*spsi;
    -stheta, sphi*ctheta, cphi*ctheta
]

答案 1 :(得分:0)

为同时发出的Http请求添加一个计数器。大多数浏览器可以同时发送6个请求发送六个请求后,等待所有六个请求的响应。收到所有六个请求的响应后,再发送六个请求。

答案 2 :(得分:0)

您可以将对likePhotos的调用包装在一个承诺中,然后在setTimeout中解析它。我已经抓住了对this的引用,因为setTimeout来电会改变背景。

我已将模拟对象中的更改包装起来,以便我可以测试它,但概念是相同的:)

function Test(){
    var self = this;
    this.likePhoto = function(a){
        return new Promise(function(resolve, reject){
           console.log(a)
           resolve(a);
        });

    };
    this.likePhotos = function(photos){
        var likes = photos.map(function(p, index, photos){
            return new Promise(function(resolve, reject){
                setTimeout(function(){
                    self.likePhoto(p).then(resolve, reject)
                }, 1000 * index)
            })
        }, this);

        return Promise.all(likes);

    }

}
var a = new Test();

a.likePhotos([1,2,3]).then(console.log);