Search code examples
javascriptnode.jsrequesttimeout

Resolve a chain of promises with timeouts. Promise.all


I have got this.

const getPrice = function(database){
    return new Promise(function (resolve, reject){
        var promises =[];
        for(var i in database){
            promises.push(Update.requestClassifieds(database[i]))
        }
    Promise.all(promises)
        .then(function(todos){
            return resolve(todos);
        })
})}

Update.prototype.requestClassifieds = function(item){
    var ithis = this;
    return new Promise((resolve, reject) => {
       var input = {};
       request({
           url: '',
           method: "GET",
           json: true,  
           body: input
  }, function (error, response, body){
    if (error){
        return resolve(item);
    }
    else if(body){
        return resolve(item);
    }
  }
});
});
}

I need to request data for each item in database. So, I created a chain of promises for that.

I am requesting data of an api that has 5 sec of cooldown. So, I need wait 5 sec until resolve next promise in Promise.all(promises).

How Can I setTimeout between each promise in Promise.all ?


Solution

  • You need to create Promise chain in your loop

    const getPrice = function (database) {
        var promisesChain = Promise.resolve(); // Promise chain
        var todos = []; // results to be stored
        for (var i in database) {
            promisesChain = promisesChain.then(((i) => () => { // create closure to grab database[i]
                return Update.requestClassifieds(database[i])
            })(i)).then((res) => {
                return new Promise((resolve, reject) => {
                    setTimeout(() => { // store result of requestClassifieds and resolve after 5sec
                        todos.push(res);
                        resolve();
                    }, 500);
                });
            })
        }
        return promisesChain.then(() => {return todos});
    };
    

    Running example

    const getPrice = function (database) {
    	var promisesChain = Promise.resolve();
    	var todos = [];
    	for (var i in database) {
    		promisesChain = promisesChain.then(((i) => () => {
    			return Update.requestClassifieds(database[i])
    		})(i)).then((res) => {
    			return new Promise((resolve, reject) => {
    				setTimeout(() => {
    					todos.push(res);
    					resolve();
              console.log('resolve', res);
    				}, 1000);
    			});
    		})
    	}
    	return promisesChain.then(() => {return todos});
    };
    const Update = {};
    Update.requestClassifieds = function (i) {
    	console.log('got', i);
    	return new Promise((resolve, reject) => {
    		resolve(i)
    	});
    }
    getPrice({
    	a: 'A',
    	b : 'B',
    	c : 'C'
    }).then(console.log);