函数外原生承诺解析的问题



我正在尝试用原生承诺来重构jQuery承诺。

public functionA(){
const dArray = Array<JQueryDeferred<{a:string}>>=[];
//other lines of logic
functionB(dArray, /*other parameters*/);
}
private functionB(dArray : Array<JQueryDeferred<{a:string}>>[], /*other arguments*/){
//other lines of logic
for(var i=0;i<10;i++){
dArray.push($.Deferred());
var ele = dArray.length-1;
functionC(dArray[ele], /*other parameters*/)
.done((result: { a:string}) => {
// logic
})
.always() => {
// some additional logic
});
}
}
private functionC(d: JQueryDeferred<{a:string}>):JQueryDeferred<{a:string}>{
if(){//some condition
// some other logic 
d.resolve({ a: "completed" });
}
return d;
}

由于上面的方法涉及到将延迟对象传递给多个函数和延迟对象数组,只是寻求任何更好的方法的帮助来重写上面的原生承诺,如下所示;

public functionA(){
const pArray = Array<Promise<{a:string}>>=[];
//other lines of logic
functionB(pArray, /*other parameters*/);
}
private functionB(pArray : Array<Promise<{a:string}>>[], /*other arguments*/){
//other lines of logic
for(var i=0;i<10;i++){
pArray.push((new Promise<{ a:string; }>(resolve => resolvePromise = resolve)););
var ele = pArray.length-1;
functionC(pArray[ele], /*other parameters*/)
.then((result: { a:string }) => {
// logic
})
.finally() => {
// some additional logic
});
}
}
private functionC(p: Promise<{a:string}>):Promise<{a:string}>{
if(){//some condition
// some other logic 
// i am stuck here..
p.resolve({ a: "completed"}) //no such resolve method to call
// tried with Promise.resolve({ a: "completed"}), 
// but my question - will it resolve same way as the index based 
// resolve like the jQuery deferred version?
}
return p;
}

提前感谢。

承诺不是传递给函数的回调函数。promise是从函数返回的结果值。它们在函数内部构造,并仅由函数内部的逻辑解析。与Deferred不同的是,它们不能被任何接触到它们的人解决。

根据这种方法,正确的代码如下:
public functionA() {
// other lines of logic
const pArray = functionB(/* other arguments */);
}
private functionB(/* other parameters */): Array<Promise<{a:string}>> {
//other lines of logic
const promises: Array<Promise<{a:string}>> = [];
for (var i=0; i<10; i++) {
promises.push(
functionC(/* … */).then((result: { a:string }) => {
// logic
}).finally() => {
// some additional logic
})
);
}
return promises;
//  ^^^^^^^^^^^^^^^
}
private functionC(): Promise<{a:string}> {
return new Promise<{ a:string; }>((resolve, reject) => {
//  ^^^^^^^^^^^^^^^^^^
if (/* some condition */) {
// some other logic 
resolve({ a: "completed"});
} else {
reject(new Error());
}
});
}

最新更新