for (let i = 0; i < 10; i++) {
const promise = new Promise((resolve, reject) => {
const timeout = Math.random() * 1000;
setTimeout(() => {
console.log(i);
}, timeout);
});
// TODO: Chain this promise to the previous one (maybe without having it running?)
}
Run Code Online (Sandbox Code Playgroud)
以上将给出以下随机输出:
6
9
4
8
5
1
7
2
3
0
Run Code Online (Sandbox Code Playgroud)
任务很简单:确保每个promise只在另一个(.then())之后运行.
出于某种原因,我找不到办法.
我尝试了生成函数(yield),尝试了返回promise的简单函数,但在一天结束时它总是归结为同样的问题:循环是同步的.
使用异步我只是使用async.series().
你是如何解决的?
假设我有这个代码
function y(resolve, reject)
{
console.log("Result");
resolve();
}
var promise = new Promise(y);
Run Code Online (Sandbox Code Playgroud)
我想知道的是该函数是否y将异步执行.
问题1:在给定时间只允许一个API请求,因此真实的网络请求排队,而尚未完成的请求.应用程序可以随时调用API级别并期望获得回报.当API调用排队时,将在未来的某个时刻创建网络请求的承诺 - 返回应用程序的内容是什么?这就是如何通过延迟的"代理"承诺来解决它:
var queue = [];
function callAPI (params) {
if (API_available) {
API_available = false;
return doRealNetRequest(params).then(function(data){
API_available = true;
continueRequests();
return data;
});
} else {
var deferred = Promise.defer();
function makeRequest() {
API_available = false;
doRealNetRequest(params).then(function(data) {
deferred.resolve(data);
API_available = true;
continueRequests();
}, deferred.reject);
}
queue.push(makeRequest);
return deferred.promise;
}
}
function continueRequests() {
if (queue.length) {
var makeRequest = queue.shift();
makeRequest();
}
}
Run Code Online (Sandbox Code Playgroud)
问题2:某些API调用被去抖动,因此要发送的数据会随着时间的推移而累积,然后在达到超时时批量发送.调用API的应用程序期待作为回报的承诺.
var queue = null;
var timeout = 0;
function callAPI2(data) {
if …Run Code Online (Sandbox Code Playgroud) 现在看来,创建延迟对象通常不鼓励使用ES6风格的Promise构造函数.是否存在使用延迟需要(或者更好地某种方式)的情况?
例如,在此页面上,给出以下示例作为使用延迟的理由:
function delay(ms) {
var deferred = Promise.pending();
setTimeout(function(){
deferred.resolve();
}, ms);
return deferred.promise;
}
Run Code Online (Sandbox Code Playgroud)
但是,这可以使用Promise构造函数完成:
function delay(ms) {
return new Promise(function(resolve, reject){
setTimeout(function(){
resolve();
}, ms);
});
}
Run Code Online (Sandbox Code Playgroud)