2016-11-13 99 views
0

我想找到一种方法来引入请求之间的一些延迟。基本上我有一个称为likePhotos的异步方法,它迭代一系列照片并为每个照片调用像Photo()。我不希望在同一时间点燃所有人,而是希望在每次致电LikePhoto之间有第二次延迟,并在完成后最终返回给主叫方。异步请求之间的JS人工延迟

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 noob所以任何建议将不胜感激!

+0

如果你想限制请求到likePhoto我不知道它是否值得在那里实施节流以避免在这里处理它。无论是使用队列和'setInterval'还是'setTimeout'都可能为你简化一些事情。如果需要,您还可以提供参数/选项以跳过队列。你实施节流的地方在很大程度上取决于你的要求,因为我意识到我的评论可能与下面guest271314的答案相矛盾。 – Brian

+0

我以前的评论指的是对答案的评论,而不是答案本身 - 抱歉,我的评论对这个答案有点混乱。 – Brian

回答

0

您可以在likePhoto之内使用setTimneout(); returnthis.likePhoto()index通过了由当前指数从.map()内繁殖1000likePhotos()呼叫

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); 
    }) 
    }); 
} 
+2

将需要索引作为持续时间的倍数,尽管如果它们都需要相隔第二秒......或者它们将在循环运行后在同一时间运行一秒 – charlietfl

+0

@charlietfl好点。也注意''this.likePhoto()'不是从'.map()' – guest271314

+0

返回的。也可能会把这个调用包装成'likePhoto'作为承诺,这可能会避免给'likePhoto'增加一个参数,尽管我的解决方案可能不会' t是可读的 – Brian

0

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

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);