Основная попытка реализации обещания Javascript
Чтобы лучше понять, как работают обещания в Javascript, я решил сам попробовать и написать базовую реализацию.
По сути, я хочу реализовать объект Promises (я называю это Aaa в моем коде), который принимает функцию в качестве аргумента. Эта функция может вызвать разрешениеresolve
обещание или отклонитьreject
Это. Основная реализация и использование ниже. Не уверен, что второй аргумент приемлем в соответствии со спецификациями обещаний, но это то, что я получил до сих пор.
Aaa=function(f,pause) {
console.log("ggg");
var t=this;
this.f=f;
this.thens=[];
this.resolve=function(g) {
for(var i=0;i<t.thens.length;i++)
{
// try/catch to be used later for dealing with exceptions
try
{
t.thens[i].f(g);
t.thens[i].resolve();
}
catch(ex)
{}
}
};
// to be implemented later
this.reject=function(g) {};
this.then=function(resolve,reject) {
// i'm passing true for pause argument as we dont need to execute promise code just yet
var nextPromise=new Aaa(resolve,true);
this.thens.push(nextPromise);
return nextPromise;
}
if(!pause)
this.f(this.resolve,this.reject);
}
var aaa=new Aaa(function(resolve,reject) {
console.log("aaa");
setTimeout(function() {
console.log("fff");
resolve("good");
},2000);
console.log("bbb");
});
Так что теперь обещание может быть создано, вызвано и решено. каждыйthen
Метод возвратит новый Aaa (Promise), поэтому они могут быть связаны. Теперь код ниже использует обещание, созданное выше, и цепочкиthen
Обратные вызовы. каждыйthen
возвращает новое обещание, и в этом случае оно работает нормально:
aaa.then(function(res) {
console.log("ccc");
console.log(res);
})
.then(function(res) {
console.log("ddd");
console.log(res);
},function(rej) {
console.log("eee");
console.log(rej);
});
вывод, который я получаю:
ggg
aaa
bbb
ggg
ggg
fff
ccc
good
ddd
undefined
Проблема, однако, когда один изthen
звонки возвращают обещание:
aaa.then(function(res) {
console.log("ccc");
console.log(res);
// here we return the promise manually. then next then call where "ddd" is output should not be called UNTIL this promise is resolved. How to do that?
return new Aaa(function(resolve,reject) {
console.log("iii");
setTimeout(function() {
console.log("kkk");
resolve("good2");
// reject("bad");
},2000);
console.log("jjj");
}).then(function (res) {
console.log("lll");
console.log(res);
});
})
.then(function(res) {
console.log("ddd");
console.log(res);
},function(rej) {
console.log("eee");
console.log(rej);
});
Выход:
ggg
aaa
bbb
ggg
ggg
fff
ccc
good
ggg
iii
jjj
ggg
ddd
undefined
kkk
lll
good2
Звонок тогда кудаddd
is output не должен вызываться, пока возвращаемое обещание, которое мы только что добавили, разрешено.
Как это будет лучше всего реализовано?