添加延迟(同步)与除 IE 之外的现代浏览器一起工作
add a delay(synchronous) working with modern browsers except IE
工作代码:在 Chrome、Firefox
中
let sleep = function (ms) {
return new Promise(resolve => setTimeout(resolve, ms))
};
在我的函数中的某处我使用异步,等待使延迟同步
function updateHandler(newTags, tagName, contentIds) {
let deferred = Q.defer(),
counter = 0,
failedIDS = [],
data = {};
data["contentIds"] = contentIds;
data["failedIDS"] = failedIDS;
if (contentIds.length === 0) {
return Promise.resolve(data);
}
//aync and await is here
_.forEach(contentIds, async function (contentId) {
//wait for some time and continue
await sleep(150);
let tags = [], activity;
//API hits..
osapi.jive.core.get({
v: "v3",
href: "/contents/" + contentId + ""
}).execute(function (content) {
tags = content.tags;
activity = content["updated"];
content["tags"] = _.union(tags, newTags);
osapi.jive.core.put({
v: "v3",
href: "/contents/" + contentId + "",
body: content,
"minor": "true",
"updated": activity
}).execute(function (response) {
counter++;
if (response.error) {
failedIDS.push(contentId);
}
if (counter === contentIds.length) {
deferred.resolve(data);
}
}, function (error) {
counter++;
failedIDS.push(contentId);
if (counter === contentIds.length) {
deferred.resolve(data);
}
}
);
})
});
return deferred.promise;
};
因此,此 api 命中必须需要 0.15 秒才能生效并更新所有项目。
由于 async 和 await 在 IE 中不起作用,我想编写一个基本的 wait(ms)
等待 0.15 秒的函数。
注意:因此,如果没有 sleep()
函数,上述循环在第一次迭代时工作正常,在第二次迭代时失败并终止代码执行。所以每次迭代必须有 0.15 秒的延迟,这是产品限制。
setTimeout()
是异步的..所以我没有使用它。
下面的代码对我有用..但这不是我想要的,因为浏览器耗尽内存和更多CPU利用率,昂贵..
function wait(ms) {
console.log("started............");
var start = Date.now(),
now = start;
while (now - start < ms) {
now = Date.now();
}
console.log("finished............");
}
问题:我想每次迭代至少有0.15秒的延迟,我该如何实现。
++我尝试了下面的方法,图片在这里。仅成功更新 100 个可迭代项中的 16 到 19 个内容,然后抛出与没有 sleep()
函数时相同的 error
。
假设我需要每 150 毫秒 运行 这个请求函数:
const request = () => new Promise(res => setTimeout(() => { console.log('done'); res() }, 1000))
//
然后我可以使用 setTimeout
递归地在每个请求之间添加延迟:
let counter = 0;
// this handler will be passed into a setTimeout
// to kick off the whole thing
const handler = () => {
console.log(counter);
// request api thing
request().then(() => {
counter++;
if (counter === 100) return;
setTimeout(handler, 150) // remove this
})
}
// kick off
setTimeout(handler, 150)
它确保在等待 运行 下一个请求之前完成每个请求。
工作代码:在 Chrome、Firefox
中let sleep = function (ms) {
return new Promise(resolve => setTimeout(resolve, ms))
};
在我的函数中的某处我使用异步,等待使延迟同步
function updateHandler(newTags, tagName, contentIds) {
let deferred = Q.defer(),
counter = 0,
failedIDS = [],
data = {};
data["contentIds"] = contentIds;
data["failedIDS"] = failedIDS;
if (contentIds.length === 0) {
return Promise.resolve(data);
}
//aync and await is here
_.forEach(contentIds, async function (contentId) {
//wait for some time and continue
await sleep(150);
let tags = [], activity;
//API hits..
osapi.jive.core.get({
v: "v3",
href: "/contents/" + contentId + ""
}).execute(function (content) {
tags = content.tags;
activity = content["updated"];
content["tags"] = _.union(tags, newTags);
osapi.jive.core.put({
v: "v3",
href: "/contents/" + contentId + "",
body: content,
"minor": "true",
"updated": activity
}).execute(function (response) {
counter++;
if (response.error) {
failedIDS.push(contentId);
}
if (counter === contentIds.length) {
deferred.resolve(data);
}
}, function (error) {
counter++;
failedIDS.push(contentId);
if (counter === contentIds.length) {
deferred.resolve(data);
}
}
);
})
});
return deferred.promise;
};
因此,此 api 命中必须需要 0.15 秒才能生效并更新所有项目。
由于 async 和 await 在 IE 中不起作用,我想编写一个基本的 wait(ms)
等待 0.15 秒的函数。
注意:因此,如果没有 sleep()
函数,上述循环在第一次迭代时工作正常,在第二次迭代时失败并终止代码执行。所以每次迭代必须有 0.15 秒的延迟,这是产品限制。
setTimeout()
是异步的..所以我没有使用它。
下面的代码对我有用..但这不是我想要的,因为浏览器耗尽内存和更多CPU利用率,昂贵..
function wait(ms) {
console.log("started............");
var start = Date.now(),
now = start;
while (now - start < ms) {
now = Date.now();
}
console.log("finished............");
}
问题:我想每次迭代至少有0.15秒的延迟,我该如何实现。
++我尝试了下面的方法,图片在这里。仅成功更新 100 个可迭代项中的 16 到 19 个内容,然后抛出与没有 sleep()
函数时相同的 error
。
假设我需要每 150 毫秒 运行 这个请求函数:
const request = () => new Promise(res => setTimeout(() => { console.log('done'); res() }, 1000))
//
然后我可以使用 setTimeout
递归地在每个请求之间添加延迟:
let counter = 0;
// this handler will be passed into a setTimeout
// to kick off the whole thing
const handler = () => {
console.log(counter);
// request api thing
request().then(() => {
counter++;
if (counter === 100) return;
setTimeout(handler, 150) // remove this
})
}
// kick off
setTimeout(handler, 150)
它确保在等待 运行 下一个请求之前完成每个请求。