我已经使用诺言在nodejs中编写了大约六个函数,我想真正发布所有这些代码,相反,我将发布一个模拟示例,以便我可以简单地封装我的问题。所以说我下面有2个功能:
foo = () => {
return new Promise( ( r , rj ) => {
setTimeout( () => {
r('DONE');
}, 3000 );
});
}
还有
bar = () => {
return new Promise( (r , rj) => { r('ALL DONE !') } )
}
现在,我想避免回调地狱,并执行以下操作:
foo().then( (resp) => console.log(resp) ).bar()
相反,我被迫要做的是:
foo().then( (resp) => { console.log(resp); bar() } )
所以基本上,在我的生产代码中,到目前为止,我有类似下面的内容(只是给你一个主意):
let uploadToVault = ( INPUT_DIR , VOLT_CRED ) => {
INPUT_DIRECTORY = INPUT_DIR;
VOLT_CREDENTIALS = VOLT_CRED;
volt_APILogin().then( () => {
volt_getProduct().then( () => {
volt_CreatePresentation().then( (resp) => {
console.log(resp);
volt_uploadSlides().then( (resp) => {
console.log(resp);
volt_bindSlide().then( (resp) => {
console.log(resp);
});
});
});
});
});
}
现在我该如何以链式格式编写而不是在回调中编写此格式?
答案 0 :(得分:4)
想法是始终兑现承诺:
volt_APILogin()
.then(() => {
return volt_getProduct();
})
.then(() => {
return volt_CreatePresentation();
})
.then((resp) => {
console.log(resp);
return volt_uploadSlides();
})
.then((resp) => {
console.log(resp);
return volt_bindSlide();
})
.then((resp) => {
console.log(resp);
return Promise.resolve('just for fun');
})
.then((resp) => {
console.log("This round is", resp);
});
然后,如果您需要在链中使用中间值,只需将它们收集到链外的变量中即可。
答案 1 :(得分:2)
一个技巧是检查异步/等待语法。基本上可以编写类似于同步代码的异步代码。
因此,如果您具有此功能:
bar = () => {
return new Promise( (r , rj) => { r('ALL DONE !') } )
}
然后您可以这样称呼它:
let fizz = async () => {
const result = await bar();
console.log(`Bar said: ${result}`);
};
对于错误处理,您可以将等待的函数调用包装在try-catch块中:
try {
const result = await bar();
console.log(`Bar said: ${result}`);
} catch {
// Handle the error
}
查看此链接以获取更多信息:https://javascript.info/async-await (或者只是谷歌“ js async await”,您会发现更多的内容:))