我试图找到一种方法来在请求之间引入一些延迟。基本上我有一个名为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菜鸟所以任何建议都将非常感谢!
答案 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);