Member 13972185 Ответов: 1

Я хочу запустить функцию "setval", завершенную после того, как эта функция "afterfirstfunc" будет выполнена


i want to run "setVal" function Completed after then that "afterFirstFunc" function will go to execute,

var setVal = function() {
var dfd=$.Deferred();
for (var i = 0; i < 5; i++) {
(function (i) {
setTimeout(function () {
console.log("Inside First "+i);
}, 1000*i);
})(i);
};
dfd.resolve();
return dfd.promise();
};
var setVal1=function(){
var dfd1=$.Deferred();
for (var i = 0; i < 5; i++) {
(function (i) {
setTimeout(function () {
console.log("Inside Second "+i);
}, 1000*i);
})(i);
};
dfd1.resolve();
return dfd1.promise();
};
setVal().then(function(){
setVal1(); 
});


Что я уже пробовал:

я хочу выполнить setVal1 run first then setVal1 will go to execute, а не обе функции работают параллельно, я перепробовал все это, но ничто не помогает мне достичь этого

1 Ответов

Рейтинг:
1

Richard Deeming

Вы разрешаете обещание, возвращенное из setVal до любой из них setTimeout вызовы выполнены.

Вам нужно подождать, пока все setTimeout вызовы завершились до разрешения обещания. Вы захотите создать отдельное обещание для каждого вызова и использовать его Обещание.все[^] ждать, пока они все завершатся.

var delay = function(time, value){
    return new Promise(function(resolve) {
        setTimeout(resolve.bind(null, value), time);
    });
};

Promise.prototype.delay = function(time) {
    return this.then(function(value) {
        return delay(time, value);
    });
};

var setVal = function(){
    var promises = [];
    for (var i = 0; i < 5; i++){
        promises.push(Promise.resolve(i).delay(i * 1000).then(function(i){
            console.log("Inside first", i);
        }));
    }
    
    return Promise.all(promises);
};

var setVal1 = function(){
    var promises = [];
    for (var i = 0; i < 5; i++){
        promises.push(Promise.resolve(i).delay(i * 1000).then(function(i){
            console.log("Inside second", i);
        }));
    }
    
    return Promise.all(promises);
};

setVal().then(setVal1);

javascript - использование setTimeout в цепочке обещаний - переполнение стека[^]
Promise - JavaScript | MDN[^]